From a363fe6a0704cdf4a01c7f07cb01cf5e042d5dd5 Mon Sep 17 00:00:00 2001 From: zhaoxiang <756958008@qq.com> Date: Sat, 15 Apr 2017 22:04:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=962.0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/Common/function.php | 91 +- Application/Admin/Common/index.html | 1 + Application/Admin/Conf/config.php | 8 + Application/Admin/Conf/index.html | 1 + .../Controller/ApiManageController.class.php | 91 + .../Admin/Controller/AppController.class.php | 94 + .../Admin/Controller/BaseController.class.php | 176 + .../FieldsInfoManageController.class.php | 67 + .../FieldsManageController.class.php | 188 + .../Controller/IndexController.class.php | 33 + .../Admin/Controller/LogController.class.php | 66 + .../Controller/LoginController.class.php | 81 + .../Admin/Controller/MenuController.class.php | 116 + .../Controller/PermissionController.class.php | 208 + .../Admin/Controller/UserController.class.php | 91 + .../Controller/UserLogController.class.php | 139 + Application/Admin/Controller/index.html | 1 + Application/Admin/Model/ApiAppModel.class.php | 23 + .../Model/ApiAuthGroupAccessModel.class.php | 11 + .../Admin/Model/ApiAuthGroupModel.class.php | 13 + .../Admin/Model/ApiAuthRuleModel.class.php | 12 + .../Admin/Model/ApiFieldsInfoModel.class.php | 13 + .../Admin/Model/ApiFieldsModel.class.php | 13 + .../Admin/Model/ApiListModel.class.php | 23 + .../Admin/Model/ApiMenuModel.class.php | 11 + .../Admin/Model/ApiUserDataModel.class.php | 10 + .../Admin/Model/ApiUserModel.class.php | 10 + Application/Admin/Model/BaseModel.class.php | 15 + Application/Admin/Model/index.html | 1 + Application/Admin/ORG/Auth.class.php | 143 + Application/Admin/Tpl/exception.tpl | 33 + Application/Admin/Tpl/jump.tpl | 63 + Application/Admin/View/ApiManage/add.html | 182 + Application/Admin/View/ApiManage/index.html | 119 + Application/Admin/View/App/add.html | 101 + Application/Admin/View/App/index.html | 95 + .../Admin/View/FieldsInfoManage/add.html | 129 + .../Admin/View/FieldsInfoManage/index.html | 61 + .../Admin/View/FieldsInfoManage/upload.html | 94 + Application/Admin/View/FieldsManage/add.html | 129 + .../Admin/View/FieldsManage/index.html | 78 + .../Admin/View/FieldsManage/upload.html | 94 + Application/Admin/View/Index/index.html | 118 + Application/Admin/View/Index/welcome.html | 10 + Application/Admin/View/Log/index.html | 162 + Application/Admin/View/Log/showDetail.html | 51 + Application/Admin/View/Login/add.html | 61 + Application/Admin/View/Login/index.html | 118 + Application/Admin/View/Menu/add.html | 109 + Application/Admin/View/Menu/index.html | 93 + Application/Admin/View/Permission/add.html | 86 + Application/Admin/View/Permission/group.html | 56 + Application/Admin/View/Permission/index.html | 99 + Application/Admin/View/Permission/member.html | 73 + Application/Admin/View/Permission/rule.html | 74 + Application/Admin/View/Public/base.html | 18 + Application/Admin/View/User/add.html | 95 + Application/Admin/View/User/index.html | 97 + Application/Admin/index.html | 1 + .../extra => Application/ApiLog}/index.html | 0 Application/Common/Common/function.php | 52 + Application/Common/Common/index.html | 1 + Application/Common/Conf/config.php | 35 + Application/Common/Conf/index.html | 1 + Application/Common/index.html | 1 + Application/Data/apiAdmin.sql | 273 + Application/Home/Api/Base.class.php | 20 + Application/Home/Api/BuildToken.class.php | 53 + Application/Home/Api/Test.class.php | 19 + Application/Home/Common/index.html | 1 + Application/Home/Conf/config.php | 14 + Application/Home/Conf/index.html | 1 + .../Home/Controller/ApiController.class.php | 151 + .../Home/Controller/BaseController.class.php | 14 + .../Home/Controller/IndexController.class.php | 10 + .../Home/Controller/WikiController.class.php | 86 + Application/Home/Controller/index.html | 1 + Application/Home/Model/BaseModel.class.php | 15 + Application/Home/Model/index.html | 1 + Application/Home/ORG/ApiLog.class.php | 61 + Application/Home/ORG/Crypt.class.php | 41 + Application/Home/ORG/DataType.class.php | 29 + Application/Home/ORG/Date.class.php | 569 + Application/Home/ORG/Filter.class.php | 156 + .../Home/ORG/Filter/ArrayFilter.class.php | 23 + Application/Home/ORG/Filter/Base.class.php | 42 + .../Home/ORG/Filter/EnumFilter.class.php | 22 + .../Home/ORG/Filter/FloatFilter.class.php | 20 + .../Home/ORG/Filter/IntegerFilter.class.php | 20 + .../Home/ORG/Filter/OtherFilter.class.php | 23 + .../Home/ORG/Filter/StringFilter.class.php | 24 + Application/Home/ORG/JPush/Config.class.php | 55 + Application/Home/ORG/JPush/Device.class.php | 13 + Application/Home/ORG/JPush/Http.class.php | 146 + Application/Home/ORG/JPush/Push.class.php | 444 + Application/Home/ORG/JPush/Report.class.php | 13 + Application/Home/ORG/JPush/Schedule.class.php | 13 + Application/Home/ORG/JPushSDK.class.php | 33 + Application/Home/ORG/Response.class.php | 92 + Application/Home/ORG/ReturnCode.class.php | 45 + .../Home/ORG/Str.class.php | 183 +- Application/Home/View/Wiki/apiField.html | 153 + Application/Home/View/Wiki/apiList.html | 69 + Application/Home/View/Wiki/calculation.html | 47 + Application/Home/View/Wiki/errorCode.html | 48 + Application/Home/View/index.html | 1 + Application/Home/index.html | 1 + Application/index.html | 1 + LICENSE | 191 - Public/css/dataTable.css | 74 + Public/dataTable/jquery.dataTables.min.js | 152 + Public/images/aznyf.jpg | Bin 0 -> 42678 bytes Public/images/bg.png | Bin 0 -> 5932 bytes Public/images/icon/bingxiang.png | Bin 0 -> 3931 bytes Public/images/icon/canzhuo.png | Bin 0 -> 5408 bytes Public/images/icon/chuang.png | Bin 0 -> 6299 bytes Public/images/icon/diannaozhuo.png | Bin 0 -> 5585 bytes Public/images/icon/dianshi.png | Bin 0 -> 5447 bytes Public/images/icon/dianti.png | Bin 0 -> 6725 bytes Public/images/icon/duwei.png | Bin 0 -> 6329 bytes Public/images/icon/gongju.png | Bin 0 -> 6089 bytes Public/images/icon/jiaju.png | Bin 0 -> 6252 bytes Public/images/icon/jianshenqicai.png | Bin 0 -> 6696 bytes Public/images/icon/kezuofan.png | Bin 0 -> 6228 bytes Public/images/icon/kongtiao.png | Bin 0 -> 6434 bytes Public/images/icon/kuandai.png | Bin 0 -> 6982 bytes Public/images/icon/liangyijia.png | Bin 0 -> 6502 bytes Public/images/icon/piaochuang.png | Bin 0 -> 6559 bytes Public/images/icon/reshuiqi.png | Bin 0 -> 5832 bytes Public/images/icon/shafa.png | Bin 0 -> 5946 bytes Public/images/icon/weibolu.png | Bin 0 -> 5750 bytes Public/images/icon/xiyiji.png | Bin 0 -> 6357 bytes Public/images/icon/yangtai.png | Bin 0 -> 6830 bytes Public/images/icon/yigui.png | Bin 0 -> 5634 bytes Public/images/icon/yinxiang.png | Bin 0 -> 6859 bytes Public/images/icon/zhinengmensuo.png | Bin 0 -> 6172 bytes Public/images/jsonFormater/Collapsed.gif | Bin 0 -> 215 bytes Public/images/jsonFormater/Expanded.gif | Bin 0 -> 206 bytes Public/images/sort_asc.png | Bin 0 -> 160 bytes Public/images/sort_both.png | Bin 0 -> 201 bytes Public/images/sort_desc.png | Bin 0 -> 158 bytes Public/js/cms.js | 149 + Public/js/forTree.js | 85 + Public/jsonFormater/jsonFormater.css | 35 + Public/jsonFormater/jsonFormater.js | 202 + Public/layui/css/layui.css | 2 + Public/layui/css/layui.mobile.css | 2 + Public/layui/css/modules/code.css | 2 + Public/layui/css/modules/laydate/icon.png | Bin 0 -> 314 bytes Public/layui/css/modules/laydate/laydate.css | 2 + .../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 | 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/layui/font/iconfont.eot | Bin 0 -> 53074 bytes Public/layui/font/iconfont.svg | 387 + Public/layui/font/iconfont.ttf | Bin 0 -> 52788 bytes Public/layui/font/iconfont.woff | Bin 0 -> 28712 bytes Public/layui/images/face/0.gif | Bin 0 -> 2689 bytes Public/layui/images/face/1.gif | Bin 0 -> 5514 bytes Public/layui/images/face/10.gif | Bin 0 -> 2797 bytes Public/layui/images/face/11.gif | Bin 0 -> 4121 bytes Public/layui/images/face/12.gif | Bin 0 -> 3361 bytes Public/layui/images/face/13.gif | Bin 0 -> 7425 bytes Public/layui/images/face/14.gif | Bin 0 -> 2375 bytes Public/layui/images/face/15.gif | Bin 0 -> 1793 bytes Public/layui/images/face/16.gif | Bin 0 -> 6721 bytes Public/layui/images/face/17.gif | Bin 0 -> 4439 bytes Public/layui/images/face/18.gif | Bin 0 -> 3017 bytes Public/layui/images/face/19.gif | Bin 0 -> 3040 bytes Public/layui/images/face/2.gif | Bin 0 -> 3222 bytes Public/layui/images/face/20.gif | Bin 0 -> 5144 bytes Public/layui/images/face/21.gif | Bin 0 -> 5191 bytes Public/layui/images/face/22.gif | Bin 0 -> 9823 bytes Public/layui/images/face/23.gif | Bin 0 -> 3792 bytes Public/layui/images/face/24.gif | Bin 0 -> 8096 bytes Public/layui/images/face/25.gif | Bin 0 -> 3127 bytes Public/layui/images/face/26.gif | Bin 0 -> 3291 bytes Public/layui/images/face/27.gif | Bin 0 -> 4377 bytes Public/layui/images/face/28.gif | Bin 0 -> 2793 bytes Public/layui/images/face/29.gif | Bin 0 -> 4854 bytes Public/layui/images/face/3.gif | Bin 0 -> 4017 bytes Public/layui/images/face/30.gif | Bin 0 -> 2555 bytes Public/layui/images/face/31.gif | Bin 0 -> 2002 bytes Public/layui/images/face/32.gif | Bin 0 -> 3481 bytes Public/layui/images/face/33.gif | Bin 0 -> 2454 bytes Public/layui/images/face/34.gif | Bin 0 -> 3700 bytes Public/layui/images/face/35.gif | Bin 0 -> 1800 bytes Public/layui/images/face/36.gif | Bin 0 -> 2331 bytes Public/layui/images/face/37.gif | Bin 0 -> 1513 bytes Public/layui/images/face/38.gif | Bin 0 -> 3615 bytes Public/layui/images/face/39.gif | Bin 0 -> 6495 bytes Public/layui/images/face/4.gif | Bin 0 -> 5689 bytes Public/layui/images/face/40.gif | Bin 0 -> 3154 bytes Public/layui/images/face/41.gif | Bin 0 -> 3644 bytes Public/layui/images/face/42.gif | Bin 0 -> 5305 bytes Public/layui/images/face/43.gif | Bin 0 -> 2674 bytes Public/layui/images/face/44.gif | Bin 0 -> 4126 bytes Public/layui/images/face/45.gif | Bin 0 -> 3417 bytes Public/layui/images/face/46.gif | Bin 0 -> 3007 bytes Public/layui/images/face/47.gif | Bin 0 -> 2333 bytes Public/layui/images/face/48.gif | Bin 0 -> 2689 bytes Public/layui/images/face/49.gif | Bin 0 -> 2315 bytes Public/layui/images/face/5.gif | Bin 0 -> 4567 bytes Public/layui/images/face/50.gif | Bin 0 -> 5866 bytes Public/layui/images/face/51.gif | Bin 0 -> 2785 bytes Public/layui/images/face/52.gif | Bin 0 -> 777 bytes Public/layui/images/face/53.gif | Bin 0 -> 2127 bytes Public/layui/images/face/54.gif | Bin 0 -> 2196 bytes Public/layui/images/face/55.gif | Bin 0 -> 1971 bytes Public/layui/images/face/56.gif | Bin 0 -> 2034 bytes Public/layui/images/face/57.gif | Bin 0 -> 2705 bytes Public/layui/images/face/58.gif | Bin 0 -> 2258 bytes Public/layui/images/face/59.gif | Bin 0 -> 10311 bytes Public/layui/images/face/6.gif | Bin 0 -> 2213 bytes Public/layui/images/face/60.gif | Bin 0 -> 3245 bytes Public/layui/images/face/61.gif | Bin 0 -> 2495 bytes Public/layui/images/face/62.gif | Bin 0 -> 2017 bytes Public/layui/images/face/63.gif | Bin 0 -> 5871 bytes Public/layui/images/face/64.gif | Bin 0 -> 6448 bytes Public/layui/images/face/65.gif | Bin 0 -> 3576 bytes Public/layui/images/face/66.gif | Bin 0 -> 3029 bytes Public/layui/images/face/67.gif | Bin 0 -> 2701 bytes Public/layui/images/face/68.gif | Bin 0 -> 1424 bytes Public/layui/images/face/69.gif | Bin 0 -> 2431 bytes Public/layui/images/face/7.gif | Bin 0 -> 3398 bytes Public/layui/images/face/70.gif | Bin 0 -> 4590 bytes Public/layui/images/face/71.gif | Bin 0 -> 5304 bytes Public/layui/images/face/8.gif | Bin 0 -> 4050 bytes Public/layui/images/face/9.gif | Bin 0 -> 4221 bytes Public/layui/lay/dest/layui.all.js | 5 + Public/layui/lay/modules/code.js | 2 + Public/layui/lay/modules/element.js | 2 + Public/layui/lay/modules/flow.js | 2 + Public/layui/lay/modules/form.js | 2 + Public/layui/lay/modules/jquery.js | 5 + Public/layui/lay/modules/laydate.js | 2 + Public/layui/lay/modules/layedit.js | 2 + Public/layui/lay/modules/layer.js | 2 + Public/layui/lay/modules/laypage.js | 2 + Public/layui/lay/modules/laytpl.js | 2 + Public/layui/lay/modules/mobile.js | 2 + Public/layui/lay/modules/tree.js | 2 + Public/layui/lay/modules/upload.js | 2 + Public/layui/lay/modules/util.js | 2 + Public/layui/layui.js | 2 + ThinkPHP/Common/functions.php | 1550 +++ ThinkPHP/Conf/convention.php | 167 + ThinkPHP/Conf/debug.php | 27 + ThinkPHP/LICENSE.txt | 32 + ThinkPHP/Lang/en-us.php | 51 + ThinkPHP/Lang/pt-br.php | 51 + ThinkPHP/Lang/zh-cn.php | 51 + ThinkPHP/Lang/zh-tw.php | 51 + .../Behavior/BuildLiteBehavior.class.php | 87 + .../Behavior/CheckLangBehavior.class.php | 77 + .../Behavior/ContentReplaceBehavior.class.php | 47 + .../Behavior/ParseTemplateBehavior.class.php | 95 + .../Behavior/ReadHtmlCacheBehavior.class.php | 117 + .../Behavior/ShowPageTraceBehavior.class.php | 119 + .../Behavior/ShowRuntimeBehavior.class.php | 69 + .../Behavior/TokenBuildBehavior.class.php | 54 + .../Behavior/WriteHtmlCacheBehavior.class.php | 29 + ThinkPHP/Library/Think/App.class.php | 213 + ThinkPHP/Library/Think/Build.class.php | 165 + ThinkPHP/Library/Think/Cache.class.php | 127 + .../Think/Cache/Driver/Apachenote.class.php | 124 + .../Library/Think/Cache/Driver/Apc.class.php | 86 + .../Library/Think/Cache/Driver/Db.class.php | 138 + .../Think/Cache/Driver/Eaccelerator.class.php | 77 + .../Library/Think/Cache/Driver/File.class.php | 181 + .../Think/Cache/Driver/Memcache.class.php | 103 + .../Think/Cache/Driver/Memcached.class.php | 102 + .../Think/Cache/Driver/Memcachesae.class.php | 144 + .../Think/Cache/Driver/Redis.class.php | 107 + .../Think/Cache/Driver/Shmop.class.php | 186 + .../Think/Cache/Driver/Sqlite.class.php | 119 + .../Think/Cache/Driver/Wincache.class.php | 88 + .../Think/Cache/Driver/Xcache.class.php | 90 + ThinkPHP/Library/Think/Controller.class.php | 307 + ThinkPHP/Library/Think/Db.class.php | 137 + ThinkPHP/Library/Think/Db/Driver.class.php | 1148 ++ .../Think/Db/Driver/Firebird.class.php | 151 + .../Library/Think/Db/Driver/Mongo.class.php | 821 ++ .../Library/Think/Db/Driver/Mysql.class.php | 235 + .../Library/Think/Db/Driver/Oracle.class.php | 168 + .../Library/Think/Db/Driver/Pgsql.class.php | 91 + .../Library/Think/Db/Driver/Sqlite.class.php | 98 + .../Library/Think/Db/Driver/Sqlsrv.class.php | 166 + ThinkPHP/Library/Think/Db/Lite.class.php | 466 + ThinkPHP/Library/Think/Dispatcher.class.php | 339 + .../Library/Think/Exception.class.php | 15 +- ThinkPHP/Library/Think/Hook.class.php | 121 + ThinkPHP/Library/Think/Log.class.php | 104 + .../Library/Think/Log/Driver/File.class.php | 50 + .../Library/Think/Log/Driver/Sae.class.php | 49 + ThinkPHP/Library/Think/Model.class.php | 1910 +++ ThinkPHP/Library/Think/Route.class.php | 316 + ThinkPHP/Library/Think/Storage.class.php | 40 + .../Think/Storage/Driver/File.class.php | 123 + .../Think/Storage/Driver/Sae.class.php | 193 + ThinkPHP/Library/Think/Template.class.php | 700 + .../Think/Template/Driver/Ease.class.php | 41 + .../Think/Template/Driver/Lite.class.php | 39 + .../Think/Template/Driver/Mobile.class.php | 28 +- .../Think/Template/Driver/Smart.class.php | 40 + .../Think/Template/Driver/Smarty.class.php | 41 + .../Library/Think/Template/TagLib.class.php | 246 + .../Think/Template/TagLib/Cx.class.php | 614 + .../Think/Template/TagLib/Html.class.php | 523 + ThinkPHP/Library/Think/Think.class.php | 344 + ThinkPHP/Library/Think/View.class.php | 229 + ThinkPHP/Library/Vendor/README.txt | 1 + ThinkPHP/Mode/common.php | 71 + ThinkPHP/ThinkPHP.php | 97 + ThinkPHP/Tpl/dispatch_jump.tpl | 49 + ThinkPHP/Tpl/page_trace.tpl | 67 + ThinkPHP/Tpl/think_exception.tpl | 58 + ThinkPHP/logo.png | Bin 0 -> 7396 bytes application/admin/common.php | 1 - application/admin/config.php | 5 - .../admin/controller/ApiFieldsManager.php | 535 - application/admin/controller/ApiManager.php | 400 - application/admin/controller/AppManager.php | 362 - application/admin/controller/AppMember.php | 268 - application/admin/controller/Auth.php | 606 - application/admin/controller/Base.php | 175 - application/admin/controller/CacheType.php | 17 - .../admin/controller/FilterManager.php | 381 - application/admin/controller/Index.php | 29 - application/admin/controller/KeyManager.php | 334 - application/admin/controller/Menu.php | 520 - application/admin/controller/PublicShow.php | 25 - application/admin/controller/ReturnCode.php | 21 - application/admin/controller/User.php | 368 - application/admin/controller/WikiManager.php | 54 - application/admin/model/Api.php | 13 - application/admin/model/ApiBack.php | 12 - application/admin/model/ApiFields.php | 12 - application/admin/model/App.php | 13 - application/admin/model/AppMember.php | 12 - application/admin/model/AuthGroup.php | 13 - application/admin/model/AuthGroupAccess.php | 13 - application/admin/model/AuthRule.php | 13 - application/admin/model/Base.php | 14 - application/admin/model/Filter.php | 12 - application/admin/model/Keys.php | 15 - application/admin/model/Menu.php | 42 - application/admin/model/User.php | 25 - application/admin/model/UserData.php | 26 - application/admin/view/index/index.html | 79 - application/admin/view/public/404.html | 94 - application/admin/view/public/500.html | 0 application/admin/view/public/base.html | 200 - application/admin/view/public/jump.html | 63 - application/admin/view/user/login.html | 63 - application/build.php | 25 - application/command.php | 12 - application/config.php | 35 - application/install/common.php | 307 - application/install/config.php | 5 - application/install/controller/Index.php | 275 - application/install/data/base.tpl | 8 - application/install/data/cache.tpl | 16 - application/install/data/database.tpl | 22 - application/install/data/install.sql | 309 - application/install/model/index.html | 0 application/install/view/index/complete.html | 20 - application/install/view/index/index.html | 23 - application/install/view/index/step2.html | 88 - application/install/view/index/step3.html | 109 - application/install/view/index/step4.html | 39 - application/install/view/public/base.html | 93 - application/install/view/public/jump.html | 63 - application/tags.php | 28 - build.php | 25 - extend/Permission.php | 172 - extend/index.html | 0 public/admin/index.php => index.php | 25 +- public/admin/.htaccess | 8 - public/admin/static/css/AdminLTE.min.css | 7 - .../admin/static/css/skins/_all-skins.min.css | 1 - .../static/css/skins/skin-black-light.min.css | 1 - .../admin/static/css/skins/skin-black.min.css | 1 - .../static/css/skins/skin-blue-light.min.css | 1 - .../admin/static/css/skins/skin-blue.min.css | 1 - .../static/css/skins/skin-green-light.min.css | 1 - .../admin/static/css/skins/skin-green.min.css | 1 - .../css/skins/skin-purple-light.min.css | 1 - .../static/css/skins/skin-purple.min.css | 1 - .../static/css/skins/skin-red-light.min.css | 1 - .../admin/static/css/skins/skin-red.min.css | 1 - .../css/skins/skin-yellow-light.min.css | 1 - .../static/css/skins/skin-yellow.min.css | 1 - public/admin/static/img/boxed-bg.jpg | Bin 123770 -> 0 bytes public/admin/static/img/boxed-bg.png | Bin 43694 -> 0 bytes public/admin/static/img/default-50x50.gif | Bin 184 -> 0 bytes public/admin/static/img/favicon.ico | Bin 4286 -> 0 bytes public/admin/static/img/icons.png | Bin 1154 -> 0 bytes public/admin/static/img/index.html | 0 public/admin/static/img/logo.jpg | Bin 20118 -> 0 bytes public/admin/static/js/app.min.js | 13 - public/admin/static/js/demo.js | 340 - public/admin/static/js/pages/dashboard.js | 210 - public/admin/static/js/pages/dashboard2.js | 274 - public/admin/static/js/template.js | 355 - public/admin/static/js/template/form.js | 235 - public/admin/static/js/template/table.js | 218 - .../static/plugin/bootBox/bootbox.min.js | 6 - .../plugin/bootstrap/css/bootstrap.min.css | 6 - .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../plugin/bootstrap/js/bootstrap.min.js | 7 - .../static/plugin/compatible/html5shiv.js | 8 - .../static/plugin/compatible/respond.min.js | 5 - .../static/plugin/fastClick/fastclick.js | 841 -- .../static/plugin/fastClick/fastclick.min.js | 1 - public/admin/static/plugin/index.html | 0 .../static/plugin/jQuery/1.12.4/jquery.js | 11008 ---------------- .../static/plugin/jQuery/1.12.4/jquery.min.js | 5 - .../static/plugin/jQuery/2.2.4/jquery.js | 9814 -------------- .../static/plugin/jQuery/2.2.4/jquery.min.js | 4 - .../static/plugin/jQuery/3.1.1/jquery.js | 10220 -------------- .../static/plugin/jQuery/3.1.1/jquery.min.js | 4 - .../plugin/slimScroll/jquery.slimscroll.js | 474 - .../slimScroll/jquery.slimscroll.min.js | 16 - public/admin/static/plugin/vue/vue.common.js | 5613 -------- public/admin/static/plugin/vue/vue.min.js | 7 - public/router.php | 17 - think | 17 - thinkphp/base.php | 63 - thinkphp/console.php | 20 - thinkphp/convention.php | 274 - thinkphp/helper.php | 550 - thinkphp/lang/zh-cn.php | 65 - thinkphp/library/think/App.php | 575 - thinkphp/library/think/Build.php | 204 - thinkphp/library/think/Cache.php | 202 - thinkphp/library/think/Collection.php | 373 - thinkphp/library/think/Config.php | 170 - thinkphp/library/think/Console.php | 718 - thinkphp/library/think/Controller.php | 209 - thinkphp/library/think/Cookie.php | 195 - thinkphp/library/think/Db.php | 153 - thinkphp/library/think/Debug.php | 216 - thinkphp/library/think/Env.php | 31 - thinkphp/library/think/Error.php | 117 - thinkphp/library/think/Exception.php | 54 - thinkphp/library/think/File.php | 411 - thinkphp/library/think/Hook.php | 130 - thinkphp/library/think/Lang.php | 221 - thinkphp/library/think/Loader.php | 551 - thinkphp/library/think/Log.php | 200 - thinkphp/library/think/Model.php | 1467 -- thinkphp/library/think/Paginator.php | 258 - thinkphp/library/think/Process.php | 1205 -- thinkphp/library/think/Request.php | 1581 --- thinkphp/library/think/Response.php | 326 - thinkphp/library/think/Route.php | 1584 --- thinkphp/library/think/Session.php | 359 - thinkphp/library/think/Template.php | 1144 -- thinkphp/library/think/Url.php | 321 - thinkphp/library/think/Validate.php | 1238 -- thinkphp/library/think/View.php | 204 - thinkphp/library/think/cache/Driver.php | 209 - thinkphp/library/think/cache/driver/File.php | 247 - thinkphp/library/think/cache/driver/Lite.php | 185 - .../library/think/cache/driver/Memcache.php | 172 - .../library/think/cache/driver/Memcached.php | 181 - thinkphp/library/think/cache/driver/Redis.php | 176 - .../library/think/cache/driver/Sqlite.php | 196 - .../library/think/cache/driver/Wincache.php | 150 - .../library/think/cache/driver/Xcache.php | 153 - thinkphp/library/think/config/driver/Ini.php | 24 - thinkphp/library/think/config/driver/Json.php | 24 - thinkphp/library/think/config/driver/Xml.php | 31 - thinkphp/library/think/console/Command.php | 470 - thinkphp/library/think/console/Input.php | 464 - thinkphp/library/think/console/LICENSE | 19 - thinkphp/library/think/console/Output.php | 222 - thinkphp/library/think/console/bin/README.md | 1 - .../library/think/console/bin/hiddeninput.exe | Bin 9216 -> 0 bytes .../library/think/console/command/Build.php | 56 - .../library/think/console/command/Clear.php | 44 - .../library/think/console/command/Help.php | 70 - .../library/think/console/command/Lists.php | 74 - .../library/think/console/command/Make.php | 109 - .../think/console/command/make/Controller.php | 50 - .../think/console/command/make/Model.php | 36 - .../command/make/stubs/controller.plain.stub | 10 - .../command/make/stubs/controller.stub | 85 - .../console/command/make/stubs/model.stub | 10 - .../console/command/optimize/Autoload.php | 281 - .../think/console/command/optimize/Config.php | 93 - .../think/console/command/optimize/Route.php | 70 - .../think/console/command/optimize/Schema.php | 111 - .../library/think/console/input/Argument.php | 115 - .../think/console/input/Definition.php | 375 - .../library/think/console/input/Option.php | 190 - thinkphp/library/think/console/output/Ask.php | 340 - .../think/console/output/Descriptor.php | 319 - .../think/console/output/Formatter.php | 198 - .../library/think/console/output/Question.php | 211 - .../console/output/descriptor/Console.php | 149 - .../think/console/output/driver/Buffer.php | 52 - .../think/console/output/driver/Console.php | 368 - .../think/console/output/driver/Nothing.php | 33 - .../think/console/output/formatter/Stack.php | 116 - .../think/console/output/formatter/Style.php | 189 - .../think/console/output/question/Choice.php | 163 - .../console/output/question/Confirmation.php | 57 - thinkphp/library/think/controller/Rest.php | 99 - thinkphp/library/think/controller/Yar.php | 51 - thinkphp/library/think/db/Builder.php | 766 -- thinkphp/library/think/db/Connection.php | 912 -- thinkphp/library/think/db/Query.php | 2311 ---- thinkphp/library/think/db/builder/Mysql.php | 62 - thinkphp/library/think/db/builder/Pgsql.php | 78 - thinkphp/library/think/db/builder/Sqlite.php | 72 - thinkphp/library/think/db/builder/Sqlsrv.php | 116 - thinkphp/library/think/db/connector/Mysql.php | 127 - thinkphp/library/think/db/connector/Pgsql.php | 110 - .../library/think/db/connector/Sqlite.php | 109 - .../library/think/db/connector/Sqlsrv.php | 130 - thinkphp/library/think/db/connector/pgsql.sql | 117 - .../think/db/exception/BindParamException.php | 35 - .../db/exception/DataNotFoundException.php | 43 - .../db/exception/ModelNotFoundException.php | 43 - thinkphp/library/think/debug/Console.php | 160 - thinkphp/library/think/debug/Html.php | 111 - .../exception/ClassNotFoundException.php | 32 - .../library/think/exception/DbException.php | 42 - .../think/exception/ErrorException.php | 57 - thinkphp/library/think/exception/Handle.php | 266 - .../library/think/exception/HttpException.php | 36 - .../think/exception/HttpResponseException.php | 33 - .../library/think/exception/PDOException.php | 41 - .../exception/RouteNotFoundException.php | 24 - .../exception/TemplateNotFoundException.php | 33 - .../think/exception/ThrowableError.php | 47 - .../think/exception/ValidateException.php | 33 - thinkphp/library/think/log/driver/File.php | 91 - thinkphp/library/think/log/driver/Socket.php | 245 - thinkphp/library/think/model/Merge.php | 316 - thinkphp/library/think/model/Pivot.php | 36 - thinkphp/library/think/model/Relation.php | 705 - .../library/think/paginator/Collection.php | 74 - .../think/paginator/driver/Bootstrap.php | 207 - thinkphp/library/think/process/Builder.php | 234 - thinkphp/library/think/process/Utils.php | 75 - .../library/think/process/exception/Faild.php | 43 - .../think/process/exception/Timeout.php | 61 - .../library/think/process/pipes/Pipes.php | 94 - thinkphp/library/think/process/pipes/Unix.php | 196 - .../library/think/process/pipes/Windows.php | 228 - thinkphp/library/think/response/Json.php | 51 - thinkphp/library/think/response/Jsonp.php | 58 - thinkphp/library/think/response/Redirect.php | 97 - thinkphp/library/think/response/View.php | 89 - thinkphp/library/think/response/Xml.php | 95 - .../library/think/session/driver/Memcache.php | 115 - .../think/session/driver/Memcached.php | 123 - .../library/think/session/driver/Redis.php | 128 - thinkphp/library/think/template/TagLib.php | 334 - .../library/think/template/driver/File.php | 71 - thinkphp/library/think/template/taglib/Cx.php | 673 - thinkphp/library/think/view/driver/Php.php | 153 - thinkphp/library/think/view/driver/Think.php | 161 - thinkphp/library/traits/controller/Jump.php | 157 - thinkphp/library/traits/model/SoftDelete.php | 147 - thinkphp/library/traits/think/Instance.php | 45 - thinkphp/logo.png | Bin 6995 -> 0 bytes thinkphp/start.php | 18 - thinkphp/tpl/default_index.tpl | 10 - thinkphp/tpl/dispatch_jump.tpl | 48 - thinkphp/tpl/page_trace.tpl | 71 - thinkphp/tpl/think_exception.tpl | 507 - vendor/index.html | 0 583 files changed, 23359 insertions(+), 81016 deletions(-) rename application/common.php => Application/Admin/Common/function.php (53%) create mode 100644 Application/Admin/Common/index.html create mode 100644 Application/Admin/Conf/config.php create mode 100644 Application/Admin/Conf/index.html create mode 100644 Application/Admin/Controller/ApiManageController.class.php create mode 100644 Application/Admin/Controller/AppController.class.php create mode 100644 Application/Admin/Controller/BaseController.class.php create mode 100644 Application/Admin/Controller/FieldsInfoManageController.class.php create mode 100644 Application/Admin/Controller/FieldsManageController.class.php create mode 100644 Application/Admin/Controller/IndexController.class.php create mode 100644 Application/Admin/Controller/LogController.class.php create mode 100644 Application/Admin/Controller/LoginController.class.php create mode 100644 Application/Admin/Controller/MenuController.class.php create mode 100644 Application/Admin/Controller/PermissionController.class.php create mode 100644 Application/Admin/Controller/UserController.class.php create mode 100644 Application/Admin/Controller/UserLogController.class.php create mode 100644 Application/Admin/Controller/index.html create mode 100644 Application/Admin/Model/ApiAppModel.class.php create mode 100644 Application/Admin/Model/ApiAuthGroupAccessModel.class.php create mode 100644 Application/Admin/Model/ApiAuthGroupModel.class.php create mode 100644 Application/Admin/Model/ApiAuthRuleModel.class.php create mode 100644 Application/Admin/Model/ApiFieldsInfoModel.class.php create mode 100644 Application/Admin/Model/ApiFieldsModel.class.php create mode 100644 Application/Admin/Model/ApiListModel.class.php create mode 100644 Application/Admin/Model/ApiMenuModel.class.php create mode 100644 Application/Admin/Model/ApiUserDataModel.class.php create mode 100644 Application/Admin/Model/ApiUserModel.class.php create mode 100644 Application/Admin/Model/BaseModel.class.php create mode 100644 Application/Admin/Model/index.html create mode 100644 Application/Admin/ORG/Auth.class.php create mode 100644 Application/Admin/Tpl/exception.tpl create mode 100644 Application/Admin/Tpl/jump.tpl create mode 100644 Application/Admin/View/ApiManage/add.html create mode 100644 Application/Admin/View/ApiManage/index.html create mode 100644 Application/Admin/View/App/add.html create mode 100644 Application/Admin/View/App/index.html create mode 100644 Application/Admin/View/FieldsInfoManage/add.html create mode 100644 Application/Admin/View/FieldsInfoManage/index.html create mode 100644 Application/Admin/View/FieldsInfoManage/upload.html create mode 100644 Application/Admin/View/FieldsManage/add.html create mode 100644 Application/Admin/View/FieldsManage/index.html create mode 100644 Application/Admin/View/FieldsManage/upload.html create mode 100644 Application/Admin/View/Index/index.html create mode 100644 Application/Admin/View/Index/welcome.html create mode 100644 Application/Admin/View/Log/index.html create mode 100644 Application/Admin/View/Log/showDetail.html create mode 100644 Application/Admin/View/Login/add.html create mode 100644 Application/Admin/View/Login/index.html create mode 100644 Application/Admin/View/Menu/add.html create mode 100644 Application/Admin/View/Menu/index.html create mode 100644 Application/Admin/View/Permission/add.html create mode 100644 Application/Admin/View/Permission/group.html create mode 100644 Application/Admin/View/Permission/index.html create mode 100644 Application/Admin/View/Permission/member.html create mode 100644 Application/Admin/View/Permission/rule.html create mode 100644 Application/Admin/View/Public/base.html create mode 100644 Application/Admin/View/User/add.html create mode 100644 Application/Admin/View/User/index.html create mode 100644 Application/Admin/index.html rename {application/extra => Application/ApiLog}/index.html (100%) create mode 100644 Application/Common/Common/function.php create mode 100644 Application/Common/Common/index.html create mode 100644 Application/Common/Conf/config.php create mode 100644 Application/Common/Conf/index.html create mode 100644 Application/Common/index.html create mode 100644 Application/Data/apiAdmin.sql create mode 100644 Application/Home/Api/Base.class.php create mode 100644 Application/Home/Api/BuildToken.class.php create mode 100644 Application/Home/Api/Test.class.php create mode 100644 Application/Home/Common/index.html create mode 100644 Application/Home/Conf/config.php create mode 100644 Application/Home/Conf/index.html create mode 100644 Application/Home/Controller/ApiController.class.php create mode 100644 Application/Home/Controller/BaseController.class.php create mode 100644 Application/Home/Controller/IndexController.class.php create mode 100644 Application/Home/Controller/WikiController.class.php create mode 100644 Application/Home/Controller/index.html create mode 100644 Application/Home/Model/BaseModel.class.php create mode 100644 Application/Home/Model/index.html create mode 100644 Application/Home/ORG/ApiLog.class.php create mode 100644 Application/Home/ORG/Crypt.class.php create mode 100644 Application/Home/ORG/DataType.class.php create mode 100644 Application/Home/ORG/Date.class.php create mode 100644 Application/Home/ORG/Filter.class.php create mode 100644 Application/Home/ORG/Filter/ArrayFilter.class.php create mode 100644 Application/Home/ORG/Filter/Base.class.php create mode 100644 Application/Home/ORG/Filter/EnumFilter.class.php create mode 100644 Application/Home/ORG/Filter/FloatFilter.class.php create mode 100644 Application/Home/ORG/Filter/IntegerFilter.class.php create mode 100644 Application/Home/ORG/Filter/OtherFilter.class.php create mode 100644 Application/Home/ORG/Filter/StringFilter.class.php create mode 100644 Application/Home/ORG/JPush/Config.class.php create mode 100644 Application/Home/ORG/JPush/Device.class.php create mode 100644 Application/Home/ORG/JPush/Http.class.php create mode 100644 Application/Home/ORG/JPush/Push.class.php create mode 100644 Application/Home/ORG/JPush/Report.class.php create mode 100644 Application/Home/ORG/JPush/Schedule.class.php create mode 100644 Application/Home/ORG/JPushSDK.class.php create mode 100644 Application/Home/ORG/Response.class.php create mode 100644 Application/Home/ORG/ReturnCode.class.php rename extend/StrOrg.php => Application/Home/ORG/Str.class.php (61%) create mode 100644 Application/Home/View/Wiki/apiField.html create mode 100644 Application/Home/View/Wiki/apiList.html create mode 100644 Application/Home/View/Wiki/calculation.html create mode 100644 Application/Home/View/Wiki/errorCode.html create mode 100644 Application/Home/View/index.html create mode 100644 Application/Home/index.html create mode 100644 Application/index.html delete mode 100644 LICENSE create mode 100644 Public/css/dataTable.css create mode 100644 Public/dataTable/jquery.dataTables.min.js create mode 100644 Public/images/aznyf.jpg create mode 100644 Public/images/bg.png create mode 100644 Public/images/icon/bingxiang.png create mode 100644 Public/images/icon/canzhuo.png create mode 100644 Public/images/icon/chuang.png create mode 100644 Public/images/icon/diannaozhuo.png create mode 100644 Public/images/icon/dianshi.png create mode 100644 Public/images/icon/dianti.png create mode 100644 Public/images/icon/duwei.png create mode 100644 Public/images/icon/gongju.png create mode 100644 Public/images/icon/jiaju.png create mode 100644 Public/images/icon/jianshenqicai.png create mode 100644 Public/images/icon/kezuofan.png create mode 100644 Public/images/icon/kongtiao.png create mode 100644 Public/images/icon/kuandai.png create mode 100644 Public/images/icon/liangyijia.png create mode 100644 Public/images/icon/piaochuang.png create mode 100644 Public/images/icon/reshuiqi.png create mode 100644 Public/images/icon/shafa.png create mode 100644 Public/images/icon/weibolu.png create mode 100644 Public/images/icon/xiyiji.png create mode 100644 Public/images/icon/yangtai.png create mode 100644 Public/images/icon/yigui.png create mode 100644 Public/images/icon/yinxiang.png create mode 100644 Public/images/icon/zhinengmensuo.png create mode 100644 Public/images/jsonFormater/Collapsed.gif create mode 100644 Public/images/jsonFormater/Expanded.gif create mode 100644 Public/images/sort_asc.png create mode 100644 Public/images/sort_both.png create mode 100644 Public/images/sort_desc.png create mode 100644 Public/js/cms.js create mode 100644 Public/js/forTree.js create mode 100644 Public/jsonFormater/jsonFormater.css create mode 100644 Public/jsonFormater/jsonFormater.js create mode 100644 Public/layui/css/layui.css create mode 100644 Public/layui/css/layui.mobile.css create mode 100644 Public/layui/css/modules/code.css create mode 100644 Public/layui/css/modules/laydate/icon.png create mode 100644 Public/layui/css/modules/laydate/laydate.css create mode 100644 Public/layui/css/modules/layer/default/icon-ext.png create mode 100644 Public/layui/css/modules/layer/default/icon.png create mode 100644 Public/layui/css/modules/layer/default/layer.css create mode 100644 Public/layui/css/modules/layer/default/loading-0.gif create mode 100644 Public/layui/css/modules/layer/default/loading-1.gif create mode 100644 Public/layui/css/modules/layer/default/loading-2.gif create mode 100644 Public/layui/font/iconfont.eot create mode 100644 Public/layui/font/iconfont.svg create mode 100644 Public/layui/font/iconfont.ttf create mode 100644 Public/layui/font/iconfont.woff create mode 100644 Public/layui/images/face/0.gif create mode 100644 Public/layui/images/face/1.gif create mode 100644 Public/layui/images/face/10.gif create mode 100644 Public/layui/images/face/11.gif create mode 100644 Public/layui/images/face/12.gif create mode 100644 Public/layui/images/face/13.gif create mode 100644 Public/layui/images/face/14.gif create mode 100644 Public/layui/images/face/15.gif create mode 100644 Public/layui/images/face/16.gif create mode 100644 Public/layui/images/face/17.gif create mode 100644 Public/layui/images/face/18.gif create mode 100644 Public/layui/images/face/19.gif create mode 100644 Public/layui/images/face/2.gif create mode 100644 Public/layui/images/face/20.gif create mode 100644 Public/layui/images/face/21.gif create mode 100644 Public/layui/images/face/22.gif create mode 100644 Public/layui/images/face/23.gif create mode 100644 Public/layui/images/face/24.gif create mode 100644 Public/layui/images/face/25.gif create mode 100644 Public/layui/images/face/26.gif create mode 100644 Public/layui/images/face/27.gif create mode 100644 Public/layui/images/face/28.gif create mode 100644 Public/layui/images/face/29.gif create mode 100644 Public/layui/images/face/3.gif create mode 100644 Public/layui/images/face/30.gif create mode 100644 Public/layui/images/face/31.gif create mode 100644 Public/layui/images/face/32.gif create mode 100644 Public/layui/images/face/33.gif create mode 100644 Public/layui/images/face/34.gif create mode 100644 Public/layui/images/face/35.gif create mode 100644 Public/layui/images/face/36.gif create mode 100644 Public/layui/images/face/37.gif create mode 100644 Public/layui/images/face/38.gif create mode 100644 Public/layui/images/face/39.gif create mode 100644 Public/layui/images/face/4.gif create mode 100644 Public/layui/images/face/40.gif create mode 100644 Public/layui/images/face/41.gif create mode 100644 Public/layui/images/face/42.gif create mode 100644 Public/layui/images/face/43.gif create mode 100644 Public/layui/images/face/44.gif create mode 100644 Public/layui/images/face/45.gif create mode 100644 Public/layui/images/face/46.gif create mode 100644 Public/layui/images/face/47.gif create mode 100644 Public/layui/images/face/48.gif create mode 100644 Public/layui/images/face/49.gif create mode 100644 Public/layui/images/face/5.gif create mode 100644 Public/layui/images/face/50.gif create mode 100644 Public/layui/images/face/51.gif create mode 100644 Public/layui/images/face/52.gif create mode 100644 Public/layui/images/face/53.gif create mode 100644 Public/layui/images/face/54.gif create mode 100644 Public/layui/images/face/55.gif create mode 100644 Public/layui/images/face/56.gif create mode 100644 Public/layui/images/face/57.gif create mode 100644 Public/layui/images/face/58.gif create mode 100644 Public/layui/images/face/59.gif create mode 100644 Public/layui/images/face/6.gif create mode 100644 Public/layui/images/face/60.gif create mode 100644 Public/layui/images/face/61.gif create mode 100644 Public/layui/images/face/62.gif create mode 100644 Public/layui/images/face/63.gif create mode 100644 Public/layui/images/face/64.gif create mode 100644 Public/layui/images/face/65.gif create mode 100644 Public/layui/images/face/66.gif create mode 100644 Public/layui/images/face/67.gif create mode 100644 Public/layui/images/face/68.gif create mode 100644 Public/layui/images/face/69.gif create mode 100644 Public/layui/images/face/7.gif create mode 100644 Public/layui/images/face/70.gif create mode 100644 Public/layui/images/face/71.gif create mode 100644 Public/layui/images/face/8.gif create mode 100644 Public/layui/images/face/9.gif create mode 100644 Public/layui/lay/dest/layui.all.js create mode 100644 Public/layui/lay/modules/code.js create mode 100644 Public/layui/lay/modules/element.js create mode 100644 Public/layui/lay/modules/flow.js create mode 100644 Public/layui/lay/modules/form.js create mode 100644 Public/layui/lay/modules/jquery.js create mode 100644 Public/layui/lay/modules/laydate.js create mode 100644 Public/layui/lay/modules/layedit.js create mode 100644 Public/layui/lay/modules/layer.js create mode 100644 Public/layui/lay/modules/laypage.js create mode 100644 Public/layui/lay/modules/laytpl.js create mode 100644 Public/layui/lay/modules/mobile.js create mode 100644 Public/layui/lay/modules/tree.js create mode 100644 Public/layui/lay/modules/upload.js create mode 100644 Public/layui/lay/modules/util.js create mode 100644 Public/layui/layui.js create mode 100644 ThinkPHP/Common/functions.php create mode 100644 ThinkPHP/Conf/convention.php create mode 100644 ThinkPHP/Conf/debug.php create mode 100644 ThinkPHP/LICENSE.txt create mode 100644 ThinkPHP/Lang/en-us.php create mode 100644 ThinkPHP/Lang/pt-br.php create mode 100644 ThinkPHP/Lang/zh-cn.php create mode 100644 ThinkPHP/Lang/zh-tw.php create mode 100644 ThinkPHP/Library/Behavior/BuildLiteBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/CheckLangBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/ContentReplaceBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/ParseTemplateBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/ShowPageTraceBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/ShowRuntimeBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/TokenBuildBehavior.class.php create mode 100644 ThinkPHP/Library/Behavior/WriteHtmlCacheBehavior.class.php create mode 100644 ThinkPHP/Library/Think/App.class.php create mode 100644 ThinkPHP/Library/Think/Build.class.php create mode 100644 ThinkPHP/Library/Think/Cache.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Apachenote.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Apc.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Db.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Eaccelerator.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/File.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Memcache.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Memcached.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Memcachesae.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Redis.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Shmop.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Sqlite.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Wincache.class.php create mode 100644 ThinkPHP/Library/Think/Cache/Driver/Xcache.class.php create mode 100644 ThinkPHP/Library/Think/Controller.class.php create mode 100644 ThinkPHP/Library/Think/Db.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver/Firebird.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver/Mongo.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver/Mysql.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver/Oracle.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver/Pgsql.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver/Sqlite.class.php create mode 100644 ThinkPHP/Library/Think/Db/Driver/Sqlsrv.class.php create mode 100644 ThinkPHP/Library/Think/Db/Lite.class.php create mode 100644 ThinkPHP/Library/Think/Dispatcher.class.php rename application/route.php => ThinkPHP/Library/Think/Exception.class.php (70%) create mode 100644 ThinkPHP/Library/Think/Hook.class.php create mode 100644 ThinkPHP/Library/Think/Log.class.php create mode 100644 ThinkPHP/Library/Think/Log/Driver/File.class.php create mode 100644 ThinkPHP/Library/Think/Log/Driver/Sae.class.php create mode 100644 ThinkPHP/Library/Think/Model.class.php create mode 100644 ThinkPHP/Library/Think/Route.class.php create mode 100644 ThinkPHP/Library/Think/Storage.class.php create mode 100644 ThinkPHP/Library/Think/Storage/Driver/File.class.php create mode 100644 ThinkPHP/Library/Think/Storage/Driver/Sae.class.php create mode 100644 ThinkPHP/Library/Think/Template.class.php create mode 100644 ThinkPHP/Library/Think/Template/Driver/Ease.class.php create mode 100644 ThinkPHP/Library/Think/Template/Driver/Lite.class.php rename thinkphp/library/think/log/driver/Test.php => ThinkPHP/Library/Think/Template/Driver/Mobile.class.php (50%) mode change 100755 => 100644 create mode 100644 ThinkPHP/Library/Think/Template/Driver/Smart.class.php create mode 100644 ThinkPHP/Library/Think/Template/Driver/Smarty.class.php create mode 100644 ThinkPHP/Library/Think/Template/TagLib.class.php create mode 100644 ThinkPHP/Library/Think/Template/TagLib/Cx.class.php create mode 100644 ThinkPHP/Library/Think/Template/TagLib/Html.class.php create mode 100644 ThinkPHP/Library/Think/Think.class.php create mode 100644 ThinkPHP/Library/Think/View.class.php create mode 100644 ThinkPHP/Library/Vendor/README.txt create mode 100644 ThinkPHP/Mode/common.php create mode 100644 ThinkPHP/ThinkPHP.php create mode 100644 ThinkPHP/Tpl/dispatch_jump.tpl create mode 100644 ThinkPHP/Tpl/page_trace.tpl create mode 100644 ThinkPHP/Tpl/think_exception.tpl create mode 100644 ThinkPHP/logo.png delete mode 100644 application/admin/common.php delete mode 100644 application/admin/config.php delete mode 100644 application/admin/controller/ApiFieldsManager.php delete mode 100644 application/admin/controller/ApiManager.php delete mode 100644 application/admin/controller/AppManager.php delete mode 100644 application/admin/controller/AppMember.php delete mode 100644 application/admin/controller/Auth.php delete mode 100644 application/admin/controller/Base.php delete mode 100644 application/admin/controller/CacheType.php delete mode 100644 application/admin/controller/FilterManager.php delete mode 100644 application/admin/controller/Index.php delete mode 100644 application/admin/controller/KeyManager.php delete mode 100644 application/admin/controller/Menu.php delete mode 100644 application/admin/controller/PublicShow.php delete mode 100644 application/admin/controller/ReturnCode.php delete mode 100644 application/admin/controller/User.php delete mode 100644 application/admin/controller/WikiManager.php delete mode 100644 application/admin/model/Api.php delete mode 100644 application/admin/model/ApiBack.php delete mode 100644 application/admin/model/ApiFields.php delete mode 100644 application/admin/model/App.php delete mode 100644 application/admin/model/AppMember.php delete mode 100644 application/admin/model/AuthGroup.php delete mode 100644 application/admin/model/AuthGroupAccess.php delete mode 100644 application/admin/model/AuthRule.php delete mode 100644 application/admin/model/Base.php delete mode 100644 application/admin/model/Filter.php delete mode 100644 application/admin/model/Keys.php delete mode 100644 application/admin/model/Menu.php delete mode 100644 application/admin/model/User.php delete mode 100644 application/admin/model/UserData.php delete mode 100644 application/admin/view/index/index.html delete mode 100644 application/admin/view/public/404.html delete mode 100644 application/admin/view/public/500.html delete mode 100644 application/admin/view/public/base.html delete mode 100644 application/admin/view/public/jump.html delete mode 100644 application/admin/view/user/login.html delete mode 100644 application/build.php delete mode 100644 application/command.php delete mode 100644 application/config.php delete mode 100644 application/install/common.php delete mode 100644 application/install/config.php delete mode 100644 application/install/controller/Index.php delete mode 100644 application/install/data/base.tpl delete mode 100644 application/install/data/cache.tpl delete mode 100644 application/install/data/database.tpl delete mode 100644 application/install/data/install.sql delete mode 100644 application/install/model/index.html delete mode 100644 application/install/view/index/complete.html delete mode 100644 application/install/view/index/index.html delete mode 100644 application/install/view/index/step2.html delete mode 100644 application/install/view/index/step3.html delete mode 100644 application/install/view/index/step4.html delete mode 100644 application/install/view/public/base.html delete mode 100644 application/install/view/public/jump.html delete mode 100644 application/tags.php delete mode 100644 build.php delete mode 100644 extend/Permission.php delete mode 100644 extend/index.html rename public/admin/index.php => index.php (54%) delete mode 100644 public/admin/.htaccess delete mode 100644 public/admin/static/css/AdminLTE.min.css delete mode 100644 public/admin/static/css/skins/_all-skins.min.css delete mode 100644 public/admin/static/css/skins/skin-black-light.min.css delete mode 100644 public/admin/static/css/skins/skin-black.min.css delete mode 100644 public/admin/static/css/skins/skin-blue-light.min.css delete mode 100644 public/admin/static/css/skins/skin-blue.min.css delete mode 100644 public/admin/static/css/skins/skin-green-light.min.css delete mode 100644 public/admin/static/css/skins/skin-green.min.css delete mode 100644 public/admin/static/css/skins/skin-purple-light.min.css delete mode 100644 public/admin/static/css/skins/skin-purple.min.css delete mode 100644 public/admin/static/css/skins/skin-red-light.min.css delete mode 100644 public/admin/static/css/skins/skin-red.min.css delete mode 100644 public/admin/static/css/skins/skin-yellow-light.min.css delete mode 100644 public/admin/static/css/skins/skin-yellow.min.css delete mode 100644 public/admin/static/img/boxed-bg.jpg delete mode 100644 public/admin/static/img/boxed-bg.png delete mode 100644 public/admin/static/img/default-50x50.gif delete mode 100644 public/admin/static/img/favicon.ico delete mode 100644 public/admin/static/img/icons.png delete mode 100644 public/admin/static/img/index.html delete mode 100644 public/admin/static/img/logo.jpg delete mode 100644 public/admin/static/js/app.min.js delete mode 100644 public/admin/static/js/demo.js delete mode 100644 public/admin/static/js/pages/dashboard.js delete mode 100644 public/admin/static/js/pages/dashboard2.js delete mode 100644 public/admin/static/js/template.js delete mode 100644 public/admin/static/js/template/form.js delete mode 100644 public/admin/static/js/template/table.js delete mode 100644 public/admin/static/plugin/bootBox/bootbox.min.js delete mode 100644 public/admin/static/plugin/bootstrap/css/bootstrap.min.css delete mode 100644 public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.eot delete mode 100644 public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.svg delete mode 100644 public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.ttf delete mode 100644 public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.woff delete mode 100644 public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 public/admin/static/plugin/bootstrap/js/bootstrap.min.js delete mode 100644 public/admin/static/plugin/compatible/html5shiv.js delete mode 100644 public/admin/static/plugin/compatible/respond.min.js delete mode 100644 public/admin/static/plugin/fastClick/fastclick.js delete mode 100644 public/admin/static/plugin/fastClick/fastclick.min.js delete mode 100644 public/admin/static/plugin/index.html delete mode 100644 public/admin/static/plugin/jQuery/1.12.4/jquery.js delete mode 100644 public/admin/static/plugin/jQuery/1.12.4/jquery.min.js delete mode 100644 public/admin/static/plugin/jQuery/2.2.4/jquery.js delete mode 100644 public/admin/static/plugin/jQuery/2.2.4/jquery.min.js delete mode 100644 public/admin/static/plugin/jQuery/3.1.1/jquery.js delete mode 100644 public/admin/static/plugin/jQuery/3.1.1/jquery.min.js delete mode 100644 public/admin/static/plugin/slimScroll/jquery.slimscroll.js delete mode 100644 public/admin/static/plugin/slimScroll/jquery.slimscroll.min.js delete mode 100644 public/admin/static/plugin/vue/vue.common.js delete mode 100644 public/admin/static/plugin/vue/vue.min.js delete mode 100644 public/router.php delete mode 100644 think delete mode 100755 thinkphp/base.php delete mode 100755 thinkphp/console.php delete mode 100755 thinkphp/convention.php delete mode 100755 thinkphp/helper.php delete mode 100755 thinkphp/lang/zh-cn.php delete mode 100755 thinkphp/library/think/App.php delete mode 100755 thinkphp/library/think/Build.php delete mode 100755 thinkphp/library/think/Cache.php delete mode 100755 thinkphp/library/think/Collection.php delete mode 100755 thinkphp/library/think/Config.php delete mode 100755 thinkphp/library/think/Console.php delete mode 100755 thinkphp/library/think/Controller.php delete mode 100755 thinkphp/library/think/Cookie.php delete mode 100755 thinkphp/library/think/Db.php delete mode 100755 thinkphp/library/think/Debug.php delete mode 100755 thinkphp/library/think/Env.php delete mode 100755 thinkphp/library/think/Error.php delete mode 100755 thinkphp/library/think/Exception.php delete mode 100755 thinkphp/library/think/File.php delete mode 100755 thinkphp/library/think/Hook.php delete mode 100755 thinkphp/library/think/Lang.php delete mode 100755 thinkphp/library/think/Loader.php delete mode 100755 thinkphp/library/think/Log.php delete mode 100755 thinkphp/library/think/Model.php delete mode 100755 thinkphp/library/think/Paginator.php delete mode 100755 thinkphp/library/think/Process.php delete mode 100755 thinkphp/library/think/Request.php delete mode 100755 thinkphp/library/think/Response.php delete mode 100755 thinkphp/library/think/Route.php delete mode 100755 thinkphp/library/think/Session.php delete mode 100755 thinkphp/library/think/Template.php delete mode 100755 thinkphp/library/think/Url.php delete mode 100755 thinkphp/library/think/Validate.php delete mode 100755 thinkphp/library/think/View.php delete mode 100755 thinkphp/library/think/cache/Driver.php delete mode 100755 thinkphp/library/think/cache/driver/File.php delete mode 100755 thinkphp/library/think/cache/driver/Lite.php delete mode 100755 thinkphp/library/think/cache/driver/Memcache.php delete mode 100755 thinkphp/library/think/cache/driver/Memcached.php delete mode 100755 thinkphp/library/think/cache/driver/Redis.php delete mode 100755 thinkphp/library/think/cache/driver/Sqlite.php delete mode 100755 thinkphp/library/think/cache/driver/Wincache.php delete mode 100755 thinkphp/library/think/cache/driver/Xcache.php delete mode 100755 thinkphp/library/think/config/driver/Ini.php delete mode 100755 thinkphp/library/think/config/driver/Json.php delete mode 100755 thinkphp/library/think/config/driver/Xml.php delete mode 100755 thinkphp/library/think/console/Command.php delete mode 100755 thinkphp/library/think/console/Input.php delete mode 100755 thinkphp/library/think/console/LICENSE delete mode 100755 thinkphp/library/think/console/Output.php delete mode 100755 thinkphp/library/think/console/bin/README.md delete mode 100755 thinkphp/library/think/console/bin/hiddeninput.exe delete mode 100755 thinkphp/library/think/console/command/Build.php delete mode 100755 thinkphp/library/think/console/command/Clear.php delete mode 100755 thinkphp/library/think/console/command/Help.php delete mode 100755 thinkphp/library/think/console/command/Lists.php delete mode 100755 thinkphp/library/think/console/command/Make.php delete mode 100755 thinkphp/library/think/console/command/make/Controller.php delete mode 100755 thinkphp/library/think/console/command/make/Model.php delete mode 100755 thinkphp/library/think/console/command/make/stubs/controller.plain.stub delete mode 100755 thinkphp/library/think/console/command/make/stubs/controller.stub delete mode 100755 thinkphp/library/think/console/command/make/stubs/model.stub delete mode 100755 thinkphp/library/think/console/command/optimize/Autoload.php delete mode 100755 thinkphp/library/think/console/command/optimize/Config.php delete mode 100755 thinkphp/library/think/console/command/optimize/Route.php delete mode 100755 thinkphp/library/think/console/command/optimize/Schema.php delete mode 100755 thinkphp/library/think/console/input/Argument.php delete mode 100755 thinkphp/library/think/console/input/Definition.php delete mode 100755 thinkphp/library/think/console/input/Option.php delete mode 100755 thinkphp/library/think/console/output/Ask.php delete mode 100755 thinkphp/library/think/console/output/Descriptor.php delete mode 100755 thinkphp/library/think/console/output/Formatter.php delete mode 100755 thinkphp/library/think/console/output/Question.php delete mode 100755 thinkphp/library/think/console/output/descriptor/Console.php delete mode 100755 thinkphp/library/think/console/output/driver/Buffer.php delete mode 100755 thinkphp/library/think/console/output/driver/Console.php delete mode 100755 thinkphp/library/think/console/output/driver/Nothing.php delete mode 100755 thinkphp/library/think/console/output/formatter/Stack.php delete mode 100755 thinkphp/library/think/console/output/formatter/Style.php delete mode 100755 thinkphp/library/think/console/output/question/Choice.php delete mode 100755 thinkphp/library/think/console/output/question/Confirmation.php delete mode 100755 thinkphp/library/think/controller/Rest.php delete mode 100755 thinkphp/library/think/controller/Yar.php delete mode 100755 thinkphp/library/think/db/Builder.php delete mode 100755 thinkphp/library/think/db/Connection.php delete mode 100755 thinkphp/library/think/db/Query.php delete mode 100755 thinkphp/library/think/db/builder/Mysql.php delete mode 100755 thinkphp/library/think/db/builder/Pgsql.php delete mode 100755 thinkphp/library/think/db/builder/Sqlite.php delete mode 100755 thinkphp/library/think/db/builder/Sqlsrv.php delete mode 100755 thinkphp/library/think/db/connector/Mysql.php delete mode 100755 thinkphp/library/think/db/connector/Pgsql.php delete mode 100755 thinkphp/library/think/db/connector/Sqlite.php delete mode 100755 thinkphp/library/think/db/connector/Sqlsrv.php delete mode 100755 thinkphp/library/think/db/connector/pgsql.sql delete mode 100755 thinkphp/library/think/db/exception/BindParamException.php delete mode 100755 thinkphp/library/think/db/exception/DataNotFoundException.php delete mode 100755 thinkphp/library/think/db/exception/ModelNotFoundException.php delete mode 100755 thinkphp/library/think/debug/Console.php delete mode 100755 thinkphp/library/think/debug/Html.php delete mode 100755 thinkphp/library/think/exception/ClassNotFoundException.php delete mode 100755 thinkphp/library/think/exception/DbException.php delete mode 100755 thinkphp/library/think/exception/ErrorException.php delete mode 100755 thinkphp/library/think/exception/Handle.php delete mode 100755 thinkphp/library/think/exception/HttpException.php delete mode 100755 thinkphp/library/think/exception/HttpResponseException.php delete mode 100755 thinkphp/library/think/exception/PDOException.php delete mode 100755 thinkphp/library/think/exception/RouteNotFoundException.php delete mode 100755 thinkphp/library/think/exception/TemplateNotFoundException.php delete mode 100755 thinkphp/library/think/exception/ThrowableError.php delete mode 100755 thinkphp/library/think/exception/ValidateException.php delete mode 100755 thinkphp/library/think/log/driver/File.php delete mode 100755 thinkphp/library/think/log/driver/Socket.php delete mode 100755 thinkphp/library/think/model/Merge.php delete mode 100755 thinkphp/library/think/model/Pivot.php delete mode 100755 thinkphp/library/think/model/Relation.php delete mode 100755 thinkphp/library/think/paginator/Collection.php delete mode 100755 thinkphp/library/think/paginator/driver/Bootstrap.php delete mode 100755 thinkphp/library/think/process/Builder.php delete mode 100755 thinkphp/library/think/process/Utils.php delete mode 100755 thinkphp/library/think/process/exception/Faild.php delete mode 100755 thinkphp/library/think/process/exception/Timeout.php delete mode 100755 thinkphp/library/think/process/pipes/Pipes.php delete mode 100755 thinkphp/library/think/process/pipes/Unix.php delete mode 100755 thinkphp/library/think/process/pipes/Windows.php delete mode 100755 thinkphp/library/think/response/Json.php delete mode 100755 thinkphp/library/think/response/Jsonp.php delete mode 100755 thinkphp/library/think/response/Redirect.php delete mode 100755 thinkphp/library/think/response/View.php delete mode 100755 thinkphp/library/think/response/Xml.php delete mode 100755 thinkphp/library/think/session/driver/Memcache.php delete mode 100755 thinkphp/library/think/session/driver/Memcached.php delete mode 100755 thinkphp/library/think/session/driver/Redis.php delete mode 100755 thinkphp/library/think/template/TagLib.php delete mode 100755 thinkphp/library/think/template/driver/File.php delete mode 100755 thinkphp/library/think/template/taglib/Cx.php delete mode 100755 thinkphp/library/think/view/driver/Php.php delete mode 100755 thinkphp/library/think/view/driver/Think.php delete mode 100755 thinkphp/library/traits/controller/Jump.php delete mode 100755 thinkphp/library/traits/model/SoftDelete.php delete mode 100755 thinkphp/library/traits/think/Instance.php delete mode 100755 thinkphp/logo.png delete mode 100755 thinkphp/start.php delete mode 100755 thinkphp/tpl/default_index.tpl delete mode 100755 thinkphp/tpl/dispatch_jump.tpl delete mode 100755 thinkphp/tpl/page_trace.tpl delete mode 100755 thinkphp/tpl/think_exception.tpl delete mode 100644 vendor/index.html diff --git a/application/common.php b/Application/Admin/Common/function.php similarity index 53% rename from application/common.php rename to Application/Admin/Common/function.php index 582c41b..e3caa14 100644 --- a/application/common.php +++ b/Application/Admin/Common/function.php @@ -1,13 +1,17 @@ <?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 流年 <liu21st@gmail.com> -// +---------------------------------------------------------------------- +/** + * 系统非常规MD5加密方法 + * @param string $str 要加密的字符串 + * @param string $auth_key 要加密的字符串 + * @return string + * @author jry <598821125@qq.com> + */ +function user_md5($str, $auth_key = ''){ + if(!$auth_key){ + $auth_key = C('AUTH_KEY'); + } + return '' === $str ? '' : md5(sha1($str) . $auth_key); +} /** * 判断是否是系统管理员 @@ -15,26 +19,25 @@ * @return bool */ function isAdministrator( $uid = '' ){ - $adminConf = config('base')['USER_ADMINISTRATOR']; - $uid = empty($uid) ? session('uid') : $uid; - if( is_array($adminConf) ){ + if( empty($uid) ) $uid = session('uid'); + if( is_array(C('USER_ADMINISTRATOR')) ){ if( is_array( $uid ) ){ - $m = array_intersect( $adminConf, $uid ); + $m = array_intersect( C('USER_ADMINISTRATOR'), $uid ); if( count($m) ){ return TRUE; } }else{ - if( in_array( $uid, $adminConf ) ){ + if( in_array( $uid, C('USER_ADMINISTRATOR') ) ){ return TRUE; } } }else{ if( is_array( $uid ) ){ - if( in_array($adminConf,$uid) ){ + if( in_array(C('USER_ADMINISTRATOR'),$uid) ){ return TRUE; } }else{ - if( $uid == $adminConf){ + if( $uid == C('USER_ADMINISTRATOR')){ return TRUE; } } @@ -42,38 +45,6 @@ function isAdministrator( $uid = '' ){ return FALSE; } -/** - * CURL post数据 - * @param $url - * @param $data - * @param array $urlParam - * @param array $header - * @return mixed - */ -function curlPost( $url, $data, $urlParam = [], $header = [] ){ - $ch = curl_init(); - if( !empty($urlParam) ){ - $url = $url.'?'.http_build_query($urlParam); - } - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, $data); - - if( !empty($header) ){ - $headerStrArr = []; - foreach ($header as $key => $value){ - $headerStrArr[] = "$key: $value"; - } - curl_setopt($ch, CURLOPT_HTTPHEADER, $headerStrArr); - } - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_URL, $url); - $return = curl_exec($ch); - curl_close($ch); - return $return; -} - /** * 把返回的数据集转换成Tree * @param $list @@ -84,9 +55,9 @@ function curlPost( $url, $data, $urlParam = [], $header = [] ){ * @return array */ function listToTree($list, $pk='id', $pid = 'fid', $child = '_child', $root = '0') { - $tree = []; + $tree = array(); if(is_array($list)) { - $refer = []; + $refer = array(); foreach ($list as $key => $data) { $refer[$data[$pk]] = &$list[$key]; } @@ -106,7 +77,7 @@ function listToTree($list, $pk='id', $pid = 'fid', $child = '_child', $root = '0 } function formatTree($list, $lv = 0, $title = 'name'){ - $formatTree = []; + $formatTree = array(); foreach($list as $key => $val){ $title_prefix = ''; for( $i=0;$i<$lv;$i++ ){ @@ -126,4 +97,20 @@ function formatTree($list, $lv = 0, $title = 'name'){ } } return $formatTree; -} \ No newline at end of file +} + +if (!function_exists('array_column')) { + function array_column($array, $val, $key = null){ + $newArr = array(); + if( is_null($key) ){ + foreach ($array as $index => $item) { + $newArr[] = $item[$val]; + } + }else{ + foreach ($array as $index => $item) { + $newArr[$item[$key]] = $item[$val]; + } + } + return $newArr; + } +} diff --git a/Application/Admin/Common/index.html b/Application/Admin/Common/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Admin/Common/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Admin/Conf/config.php b/Application/Admin/Conf/config.php new file mode 100644 index 0000000..1951f7f --- /dev/null +++ b/Application/Admin/Conf/config.php @@ -0,0 +1,8 @@ +<?php + +return array( + //模板相关配置 + 'TMPL_ACTION_ERROR' => APP_PATH.'Admin/Tpl/jump.tpl', // 默认错误跳转对应的模板文件 + 'TMPL_ACTION_SUCCESS' => APP_PATH.'Admin/Tpl/jump.tpl', // 默认成功跳转对应的模板文件 + 'TMPL_EXCEPTION_FILE' => APP_PATH.'Admin/Tpl/exception.tpl',// 异常页面的模板文件 +); \ No newline at end of file diff --git a/Application/Admin/Conf/index.html b/Application/Admin/Conf/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Admin/Conf/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Admin/Controller/ApiManageController.class.php b/Application/Admin/Controller/ApiManageController.class.php new file mode 100644 index 0000000..eb75ac3 --- /dev/null +++ b/Application/Admin/Controller/ApiManageController.class.php @@ -0,0 +1,91 @@ +<?php +/** + * + * @since 2017/03/08 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Controller; + + +class ApiManageController extends BaseController { + public function index() { + //添加排序 //add by wkj 2017-03-18 + $list = D('ApiList')->order('id asc')->select(); + $this->assign('list', $list); + $this->display(); + } + + public function edit() { + if( IS_GET ) { + $id = I('get.id'); + if( $id ){ + $detail = D('ApiList')->where(array('id' => $id))->find(); + $this->assign('detail', $detail); + $this->display('add'); + }else{ + $this->redirect('add'); + } + }elseif( IS_POST ) { + $data = I('post.'); + $res = D('ApiList')->where(array('id' => $data['id']))->save($data); + if( $res === false ) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } + } + + public function add() { + if( IS_POST ) { + $data = I('post.'); + $res = D('ApiList')->add($data); + if( $res === false ) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } else { + $data['hash'] = uniqid(); + $this->assign('detail', $data); + $this->display(); + } + } + + public function open() { + if( IS_POST ) { + $id = I('post.id'); + if( $id ) { + D('ApiList')->open(array('id' => $id)); + $this->ajaxSuccess('操作成功'); + } else { + $this->ajaxError('缺少参数'); + } + } + } + + public function close() { + if( IS_POST ) { + $id = I('post.id'); + if( $id ) { + D('ApiList')->close(array('id' => $id)); + $this->ajaxSuccess('操作成功'); + } else { + $this->ajaxError('缺少参数'); + } + } + } + + public function del() { + if( IS_POST ) { + $id = I('post.id'); + if( $id ) { + D('ApiList')->del(array('id' => $id)); + $this->ajaxSuccess('操作成功'); + } else { + $this->ajaxError('缺少参数'); + } + } + } +} \ No newline at end of file diff --git a/Application/Admin/Controller/AppController.class.php b/Application/Admin/Controller/AppController.class.php new file mode 100644 index 0000000..ddd8f8b --- /dev/null +++ b/Application/Admin/Controller/AppController.class.php @@ -0,0 +1,94 @@ +<?php +/** + * + * @since 2017/03/06 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Controller; + + +use Home\ORG\Str; + +class AppController extends BaseController { + + public function index(){ + $list = D('ApiApp')->select(); + $this->assign('list', $list); + $this->display(); + } + + public function edit(){ + if( IS_GET ){ + $id = I('get.id'); + if( $id ){ + $detail = D('ApiApp')->where(array('id' => $id))->find(); + $this->assign('detail', $detail); + $this->display('add'); + }else{ + $this->redirect('add'); + } + }elseif( IS_POST ){ + $data = I('post.'); + $res = D('ApiApp')->where(array('id' => $data['id']))->save($data); + if( $res === false ){ + $this->ajaxError('操作失败'); + }else{ + $this->ajaxSuccess('添加成功'); + } + } + } + + public function add(){ + if( IS_POST ){ + $data = I('post.'); + $res = D('ApiApp')->add($data); + if( $res === false ){ + $this->ajaxError('操作失败'); + }else{ + $this->ajaxSuccess('添加成功'); + } + }else{ + $data['app_id'] = Str::randString(8, 1); + $data['app_secret'] = Str::randString(32); + $this->assign('detail', $data); + $this->display(); + } + } + + public function open(){ + if( IS_POST ){ + $id = I('post.id'); + if( $id ){ + D('ApiApp')->open(array('id' => $id)); + $this->ajaxSuccess('操作成功'); + }else{ + $this->ajaxError('缺少参数'); + } + } + } + + public function close(){ + if( IS_POST ){ + $id = I('post.id'); + if( $id ){ + D('ApiApp')->close(array('id' => $id)); + $this->ajaxSuccess('操作成功'); + }else{ + $this->ajaxError('缺少参数'); + } + } + } + + public function del(){ + if( IS_POST ){ + $id = I('post.id'); + if( $id ){ + D('ApiApp')->del(array('id' => $id)); + $this->ajaxSuccess('操作成功'); + }else{ + $this->ajaxError('缺少参数'); + } + } + } +} \ No newline at end of file diff --git a/Application/Admin/Controller/BaseController.class.php b/Application/Admin/Controller/BaseController.class.php new file mode 100644 index 0000000..577b77d --- /dev/null +++ b/Application/Admin/Controller/BaseController.class.php @@ -0,0 +1,176 @@ +<?php +/** + * 工程基类 + * @since 2017/02/28 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Controller; + + +use Think\Controller; +use Admin\ORG\Auth; + +class BaseController extends Controller { + + protected $userInfo; + protected $allMenu; + protected $uid; + + private $url; + private $menuInfo; + + public function _initialize(){ + + //初始化系统 + $this->uid = session('uid'); + $this->assign('uid', $this->uid); + $this->iniSystem(); + + //控制器初始化 + if(method_exists($this, 'myInit')){ + $this->myInit(); + } + } + + /** + * 自定义初始化函数 + */ + public function myInit(){} + + /** + * Ajax正确返回,自动添加debug数据 + * @param $msg + * @param array $data + * @param int $code + */ + public function ajaxSuccess( $msg, $code = 1, $data = array() ){ + $returnData = array( + 'code' => $code, + 'msg' => $msg, + 'data' => $data + ); + if( !empty($this->debug) ){ + $returnData['debug'] = $this->debug; + } + $this->ajaxReturn($returnData, 'json'); + } + + /** + * Ajax错误返回,自动添加debug数据 + * @param $msg + * @param array $data + * @param int $code + */ + public function ajaxError( $msg, $code = 0, $data = array() ){ + $returnData = array( + 'code' => $code, + 'msg' => $msg, + 'data' => $data + ); + if( !empty($this->debug) ){ + $returnData['debug'] = $this->debug; + } + $this->ajaxReturn($returnData, 'json'); + } + + /** + * 将二维数组变成指定key + * @param $array + * @param $keyName + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return array + */ + protected function buildArrByNewKey($array, $keyName = 'id') { + $list = array(); + foreach ($array as $item) { + $list[$item[$keyName]] = $item; + } + return $list; + } + + private function iniSystem() { + $this->url = CONTROLLER_NAME . '/' . ACTION_NAME; + $this->isForbid(); + if (CONTROLLER_NAME != 'Login') { + $this->allMenu = D('ApiMenu')->order('sort asc')->select(); + $this->menuInfo = D('ApiMenu')->where(array('url' => $this->url))->find(); + if (empty($this->menuInfo)) { + if (IS_AJAX) { + $this->ajaxError('当前URL非法'); + } else { + $this->error('当前URL非法'); + } + } + $this->checkLogin(); + $this->checkRule(); + $this->iniLog(); + } + } + + /** + * 封号,或者封IP等特殊需求才用到的 + * @return bool + */ + private function isForbid() { + return true; + } + + /** + * 检测登录 + */ + private function checkLogin() { + if (isset($this->uid) && !empty($this->uid)) { + $sidNow = session_id(); + $sidOld = S($this->uid); + if (isset($sidOld) && !empty($sidOld)) { + if ($sidOld !== $sidNow) { + $this->error("您的账号在别的地方登录了,请重新登录!", U('Login/index')); + } else { + S($this->uid, $sidNow, C('ONLINE_TIME')); + $this->userInfo = $userInfo = D('ApiUser')->where(array('id' => $this->uid))->find(); + $this->assign('userInfo', $this->userInfo); + } + } else { + $this->error("登录超时,请重新登录!", U('Login/index')); + } + } else { + $this->redirect('Login/index'); + } + + } + + /** + * 检测权限 + */ + private function checkRule() { + $isAdmin = isAdministrator(); + if ($isAdmin) { + return true; + } else { + if ($this->menuInfo['level'] !== 0) { + $authObj = new Auth(); + $check = $authObj->check(strtolower($this->url), $this->uid); + if (!$check) { + $this->ajaxError(L('_VALID_ACCESS_')); + } + } + } + } + + /** + * 根据菜单级别进行区别Log记录,当然,如果有更加细节的控制,也可以在这个函数内实现 + */ + private function iniLog() { + $data = array( + 'actionName' => $this->menuInfo['name'], + 'uid' => $this->uid, + 'nickname' => $this->userInfo['nickname'], + 'addTime' => time(), + 'url' => $this->menuInfo['url'], + 'data' => json_encode($_REQUEST) + ); + D('ApiUserAction')->add($data); + } + +} \ No newline at end of file diff --git a/Application/Admin/Controller/FieldsInfoManageController.class.php b/Application/Admin/Controller/FieldsInfoManageController.class.php new file mode 100644 index 0000000..8a0a6ee --- /dev/null +++ b/Application/Admin/Controller/FieldsInfoManageController.class.php @@ -0,0 +1,67 @@ +<?php +/** + * + * @since 2017/04/01 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Controller; + + +class FieldsInfoManageController extends BaseController { + + public function index() { + $list = D('ApiFieldsInfo')->order('id asc')->select(); + $this->assign('list', $list); + $this->display(); + } + + public function edit() { + if( IS_GET ) { + $id = I('get.id'); + if( $id ){ + $detail = D('ApiFieldsInfo')->where(array('id' => $id))->find(); + $this->assign('detail', $detail); + $this->display('add'); + }else{ + $this->redirect('add'); + } + }elseif( IS_POST ) { + $data = I('post.'); + $res = D('ApiFieldsInfo')->where(array('id' => $data['id']))->save($data); + if( $res === false ) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } + } + + public function add() { + if( IS_POST ) { + $data = I('post.'); + $res = D('ApiFieldsInfo')->add($data); + if( $res === false ) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } else { + $data['hash'] = uniqid(); + $this->assign('detail', $data); + $this->display(); + } + } + + public function del() { + if( IS_POST ) { + $id = I('post.id'); + if( $id ) { + D('ApiFieldsInfo')->where(array('id' => $id))->delete(); + $this->ajaxSuccess('操作成功'); + } else { + $this->ajaxError('缺少参数'); + } + } + } +} \ No newline at end of file diff --git a/Application/Admin/Controller/FieldsManageController.class.php b/Application/Admin/Controller/FieldsManageController.class.php new file mode 100644 index 0000000..03a9ac1 --- /dev/null +++ b/Application/Admin/Controller/FieldsManageController.class.php @@ -0,0 +1,188 @@ +<?php +/** + * + * @since 2017/03/09 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Controller; + + +use Home\ORG\DataType; + +class FieldsManageController extends BaseController { + + private $dataType = array( + DataType::TYPE_INTEGER => 'Integer', + DataType::TYPE_STRING => 'String', + DataType::TYPE_BOOLEAN => 'Boolean', + DataType::TYPE_ENUM => 'Enum', + DataType::TYPE_FLOAT => 'Float', + DataType::TYPE_FILE => 'File', + DataType::TYPE_MOBILE => 'Mobile', + DataType::TYPE_OBJECT => 'Object', + DataType::TYPE_ARRAY => 'Array' + ); + + public function index() { + } + + public function request() { + $hash = I('get.hash'); + $where['type'] = 0; + if (!empty($hash)) { + $where['hash'] = $hash; + } + $res = D('ApiFields')->where($where)->select(); + $this->assign('dataType', $this->dataType); + $this->assign('list', $res); + $this->assign('type', 0); + $this->display('index'); + } + + public function response() { + $hash = I('get.hash'); + $where['type'] = 1; + if (!empty($hash)) { + $where['hash'] = $hash; + } + $res = D('ApiFields')->where($where)->select(); + $this->assign('dataType', $this->dataType); + $this->assign('list', $res); + $this->assign('type', 1); + $this->display('index'); + } + + public function add() { + if (IS_POST) { + $data = I('post.'); + $data['fieldName'] = $data['showName']; + $res = D('ApiFields')->add($data); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } else { + $this->assign('dataType', $this->dataType); + $this->display(); + } + } + + public function edit() { + if (IS_POST) { + $data = I('post.'); + $data['fieldName'] = $data['showName']; + $res = D('ApiFields')->where(array('id' => $data['id']))->save($data); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } else { + $id = I('get.id'); + if ($id) { + $detail = D('ApiFields')->where(array('id' => $id))->find(); + $this->assign('detail', $detail); + $this->assign('dataType', $this->dataType); + $this->display('add'); + } + } + } + + public function del() { + if (IS_POST) { + $id = I('post.id'); + if ($id) { + D('ApiFields')->where(array('id' => $id))->delete(); + $this->ajaxSuccess('操作成功'); + } else { + $this->ajaxError('缺少参数'); + } + } + } + + public function upload() { + if (IS_POST) { + $hash = I('post.hash'); + $jsonStr = I('post.jsonStr'); + $jsonStr = html_entity_decode($jsonStr); + $data = json_decode($jsonStr, true); + D('ApiList')->where(array('hash' => $hash))->save(array('returnStr' => json_encode($data))); + $this->handle($data['data'], $dataArr); + D('ApiFields')->where(array( + 'hash' => $hash, + 'type' => I('post.type') + ))->delete(); + D('ApiFields')->addAll($dataArr); + $this->ajaxSuccess('操作成功'); + } else { + $this->display(); + } + } + + private function handle($data, &$dataArr, $prefix = 'data', $index = 'data') { + if (!$this->isAssoc($data)) { + $addArr = array( + 'fieldName' => $index, + 'showName' => $prefix, + 'hash' => I('post.hash'), + 'isMust' => 1, + 'dataType' => DataType::TYPE_ARRAY, + 'type' => I('post.type') + ); + $dataArr[] = $addArr; + $prefix .= '[]'; + if (is_array($data[0])) { + $this->handle($data[0], $dataArr, $prefix); + } + } else { + $addArr = array( + 'fieldName' => $index, + 'showName' => $prefix, + 'hash' => I('post.hash'), + 'isMust' => 1, + 'dataType' => DataType::TYPE_OBJECT, + 'type' => I('post.type') + ); + $dataArr[] = $addArr; + $prefix .= '{}'; + foreach ($data as $index => $datum) { + $myPre = $prefix . $index; + $addArr = array( + 'fieldName' => $index, + 'showName' => $myPre, + 'hash' => I('post.hash'), + 'isMust' => 1, + 'dataType' => DataType::TYPE_STRING, + 'type' => I('post.type') + ); + if (is_numeric($datum)) { + if (preg_match('/^\d*$/', $datum)) { + $addArr['dataType'] = DataType::TYPE_INTEGER; + } else { + $addArr['dataType'] = DataType::TYPE_FLOAT; + } + $dataArr[] = $addArr; + } elseif (is_array($datum)) { + $this->handle($datum, $dataArr, $myPre, $index); + } else { + $addArr['dataType'] = DataType::TYPE_STRING; + $dataArr[] = $addArr; + } + } + } + } + + /** + * 判断是否是关联数组(true表示是关联数组) + * @param array $arr + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return bool + */ + private function isAssoc(array $arr) { + if (array() === $arr) return false; + + return array_keys($arr) !== range(0, count($arr) - 1); + } +} \ No newline at end of file diff --git a/Application/Admin/Controller/IndexController.class.php b/Application/Admin/Controller/IndexController.class.php new file mode 100644 index 0000000..c468dc8 --- /dev/null +++ b/Application/Admin/Controller/IndexController.class.php @@ -0,0 +1,33 @@ +<?php +namespace Admin\Controller; + + +use Admin\ORG\Auth; + +class IndexController extends BaseController { + public function index() { + $isAdmin = isAdministrator(); + $list = array(); + $menuAll = $this->allMenu; + foreach ($menuAll as $key => $menu) { + if($menu['hide'] != 0){ + unset($menuAll[$key]); + } + } + foreach ($menuAll as $menu) { + if($isAdmin){ + $menu['url'] = U($menu['url']); + $list[] = $menu; + }else{ + $authObj = new Auth(); + $authList = $authObj->getAuthList($this->uid); + if (in_array(strtolower($menu['url']), $authList) || $menu['url'] == '') { + $menu['url'] = U($menu['url']); + $list[] = $menu; + } + } + } + $this->assign('list', $list); + $this->display(); + } +} \ No newline at end of file diff --git a/Application/Admin/Controller/LogController.class.php b/Application/Admin/Controller/LogController.class.php new file mode 100644 index 0000000..d858628 --- /dev/null +++ b/Application/Admin/Controller/LogController.class.php @@ -0,0 +1,66 @@ +<?php +/** + * @since 2017-04-13 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Controller; + + +class LogController extends BaseController { + public function index() { + $this->display(); + } + + public function ajaxGetIndex() { + $postData = I('post.'); + $start = $postData['start'] ? $postData['start'] : 0; + $limit = $postData['length'] ? $postData['length'] : 20; + $draw = $postData['draw']; + $where = array(); + $getInfo = I('get.'); + if (isset($getInfo['type']) && !empty($getInfo['type'])) { + if (isset($getInfo['keyword']) && !empty($getInfo['keyword'])) { + switch ($getInfo['type']) { + case 1: + $where['url'] = array('like', '%' . $getInfo['keyword'] . '%'); + break; + case 2: + $where['nickname'] = array('like', '%' . $getInfo['keyword'] . '%'); + break; + case 3: + $where['uid'] = $getInfo['keyword']; + break; + } + } + } + $total = D('ApiUserAction')->where($where)->count(); + $info = D('ApiUserAction')->where($where)->limit($start, $limit)->select(); + $data = array( + 'draw' => $draw, + 'recordsTotal' => $total, + 'recordsFiltered' => $total, + 'data' => $info + ); + $this->ajaxReturn($data, 'json'); + } + + public function del() { + $id = I('post.id'); + $res = D('ApiUserAction')->where(array('id' => $id))->delete(); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('操作成功'); + } + } + + public function showDetail() { + if (IS_GET) { + $id = I('get.id'); + $listInfo = D('ApiUserAction')->where(array('id' => $id))->find(); + $this->assign('detail', $listInfo); + $this->display(); + } + } +} \ No newline at end of file diff --git a/Application/Admin/Controller/LoginController.class.php b/Application/Admin/Controller/LoginController.class.php new file mode 100644 index 0000000..9c27085 --- /dev/null +++ b/Application/Admin/Controller/LoginController.class.php @@ -0,0 +1,81 @@ +<?php + +namespace Admin\Controller; + +/** + * 登录控制器 + * @since 2016-01-16 + * @author zhaoxiang <zhaoxiang051405@outlook.com> + */ +class LoginController extends BaseController { + + public function index() { + $this->display(); + } + + public function login() { + $pass = user_md5(I('post.password')); + $user = I('post.username'); + $userInfo = D('ApiUser')->where(array('username' => $user, 'password' => $pass))->find(); + if (!empty($userInfo)) { + if ($userInfo['status']) { + + //保存用户信息和登录凭证 + S($userInfo['id'], session_id(), C('ONLINE_TIME')); + session('uid', $userInfo['id']); + + //更新用户数据 + $userData = D('ApiUserData')->where(array('uid' => $userInfo['id']))->find(); + $data = array(); + if ($userData) { + $data['loginTimes'] = $userData['loginTimes'] + 1; + $data['lastLoginIp'] = get_client_ip(1); + $data['lastLoginTime'] = NOW_TIME; + D('ApiUserData')->where(array('uid' => $userInfo['id']))->save($data); + } else { + $data['loginTimes'] = 1; + $data['uid'] = $userInfo['id']; + $data['lastLoginIp'] = get_client_ip(1); + $data['lastLoginTime'] = NOW_TIME; + D('ApiUserData')->add($data); + } + $this->ajaxSuccess('登录成功'); + } else { + $this->ajaxError('用户已被封禁,请联系管理员'); + } + } else { + $this->ajaxError('用户名密码不正确'); + } + } + + public function logOut() { + S(session('uid'), null); + session('[destroy]'); + $this->success('退出成功', U('Login/index')); + } + + public function changeUser() { + if (IS_POST) { + $data = I('post.'); + $newData = array(); + if (!empty($data['nickname'])) { + $newData['nickname'] = $data['nickname']; + } + if (!empty($data['password'])) { + $newData['password'] = user_md5($data['password']); + $newData['updateTime'] = time(); + } + $res = D('ApiUser')->where(array('id' => session('uid')))->save($newData); + if ($res === false) { + $this->ajaxError('修改失败'); + } else { + $this->ajaxSuccess('修改成功'); + } + } else { + $userInfo = D('ApiUser')->where(array('id' => session('uid')))->find(); + $this->assign('uname', $userInfo['username']); + $this->display('add'); + } + } + +} \ No newline at end of file diff --git a/Application/Admin/Controller/MenuController.class.php b/Application/Admin/Controller/MenuController.class.php new file mode 100644 index 0000000..56c8860 --- /dev/null +++ b/Application/Admin/Controller/MenuController.class.php @@ -0,0 +1,116 @@ +<?php + +namespace Admin\Controller; + +/** + * 菜单管理控制器 + * @since 2016-01-16 + * @author zhaoxiang <zhaoxiang051405@outlook.com> + */ +class MenuController extends BaseController { + + /** + * 获取菜单列表 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + public function index() { + $list = D('ApiMenu')->order('sort asc')->select(); + $list = formatTree(listToTree($list)); + $this->assign('list', $list); + $this->display(); + } + + /** + * 新增菜单 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + public function add() { + if (IS_POST) { + $data = I('post.'); + $data['hide'] = isset($data['hide']) ? 1 : 0; + $res = D('ApiMenu')->add($data); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } else { + $originList = D('ApiMenu')->order('sort asc')->select(); + $fid = ''; + $id = I('get.id'); + if (!empty($id)) { + $fid = $id; + } + $options = array_column(formatTree(listToTree($originList)), 'showName', 'id'); + $this->assign('options', $options); + $this->assign('fid', $fid); + $this->display(); + } + } + + /** + * 显示菜单 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + public function open() { + $id = I('post.id'); + $res = D('ApiMenu')->where(array('id' => $id))->save(array('hide' => 0)); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } + + /** + * 隐藏菜单 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + public function close() { + $id = I('post.id'); + $res = D('ApiMenu')->where(array('id' => $id))->save(array('hide' => 1)); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } + + /** + * 编辑菜单 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + public function edit() { + if (IS_GET) { + $originList = D('ApiMenu')->order('sort asc')->select(); + $list = $this->buildArrByNewKey($originList); + $listInfo = $list[I('get.id')]; + $options = array_column(formatTree(listToTree($originList)), 'showName', 'id'); + + $this->assign('detail', $listInfo); + $this->assign('options', $options); + $this->display('add'); + } elseif (IS_POST) { + $postData = I('post.'); + $postData['hide'] = isset($postData['hide']) ? 1 : 0; + $res = D('ApiMenu')->where(array('id' => $postData['id']))->save($postData); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('编辑成功'); + } + } + } + + public function del() { + $id = I('post.id'); + $childNum = D('ApiMenu')->where(array('fid' => $id))->count(); + if ($childNum) { + $this->ajaxError("当前菜单存在子菜单,不可以被删除!"); + } else { + D('ApiMenu')->where(array('id' => $id))->delete(); + $this->ajaxSuccess('编辑成功'); + } + } + +} \ No newline at end of file diff --git a/Application/Admin/Controller/PermissionController.class.php b/Application/Admin/Controller/PermissionController.class.php new file mode 100644 index 0000000..ff2dc1e --- /dev/null +++ b/Application/Admin/Controller/PermissionController.class.php @@ -0,0 +1,208 @@ +<?php + +namespace Admin\Controller; + +/** + * 权限管理控制器 + * @since 2016-01-16 + * @author zhaoxiang <zhaoxiang051405@outlook.com> + */ +class PermissionController extends BaseController { + + public function index() { + $listInfo = D('ApiAuthGroup')->select(); + $this->assign('list', $listInfo); + $this->display(); + } + + public function add() { + if (IS_POST) { + $res = D('ApiAuthGroup')->add(I('post.')); + if ($res === false) { + $this->ajaxError(L('_OPERATION_FAIL_')); + } else { + $this->ajaxSuccess(L('_OPERATION_SUCCESS_')); + } + } else { + $this->display(); + } + } + + public function close() { + $id = I('post.id'); + if ($id == C('ADMIN_GROUP')) { + $this->ajaxError(L('_VALID_ACCESS_')); + } + $res = D('ApiAuthGroup')->where(array('id' => $id))->save(array('status' => 0)); + if ($res === false) { + $this->ajaxError(L('_OPERATION_FAIL_')); + } else { + $this->ajaxSuccess(L('_OPERATION_SUCCESS_')); + } + } + + public function open() { + $id = I('post.id'); + $res = D('ApiAuthGroup')->where(array('id' => $id))->save(array('status' => 1)); + if ($res === false) { + $this->ajaxError(L('_OPERATION_FAIL_')); + } else { + $this->ajaxSuccess(L('_OPERATION_SUCCESS_')); + } + } + + public function edit() { + if (IS_GET) { + $detail = D('ApiAuthGroup')->where(array('id' => I('get.id')))->find(); + $this->assign('detail', $detail); + $this->display('add'); + } elseif (IS_POST) { + $res = D('ApiAuthGroup')->where(array('id' => I('post.id')))->save(I('post.')); + if ($res === false) { + $this->ajaxError(L('_OPERATION_FAIL_')); + } else { + $this->ajaxSuccess(L('_OPERATION_SUCCESS_')); + } + } else { + $this->ajaxError(L('_ERROR_ACTION_')); + } + } + + public function del() { + $id = I('post.id'); + if ($id == C('ADMIN_GROUP')) { + $this->error(L('_VALID_ACCESS_')); + } + $res = D('ApiAuthGroup')->where(array('id' => $id))->delete(); + if ($res === false) { + $this->ajaxError(L('_OPERATION_FAIL_')); + } else { + $this->ajaxSuccess(L('_OPERATION_SUCCESS_')); + } + } + + /** + * 将管理员加入组的组列表显示 + */ + public function group() { + if (IS_POST) { + $data = I('post.'); + $groupAccess = array_keys($data['groupAccess']); + $groupAccess = implode(',', $groupAccess); + $oldArr = D('ApiAuthGroupAccess')->where(array('uid' => $data['uid']))->find(); + if ($oldArr) { + $insert = D('ApiAuthGroupAccess')->where(array('uid' => $data['uid']))->save(array('groupId' => $groupAccess)); + } else { + $insert = D('ApiAuthGroupAccess')->add(array('uid' => $data['uid'], 'groupId' => $groupAccess)); + } + if ($insert) { + $this->ajaxSuccess(L('_OPERATION_SUCCESS_')); + } else { + $this->ajaxError(L('_OPERATION_FAIL_')); + } + } elseif (IS_GET) { + $uid = I('get.uid'); + $groupAccess = D('ApiAuthGroupAccess')->where(array('uid' => $uid))->find(); + $groupAccess = explode(',', $groupAccess['groupId']); + $allGroup = D('ApiAuthGroup')->select(); + $this->assign('allGroup', $allGroup); + $this->assign('groupAccess', $groupAccess); + $this->display(); + } else { + $this->ajaxError('非法操作'); + } + } + + /** + * 显示当前组下面全部的用户 + */ + public function member() { + $groupId = I('get.group_id'); + if ($groupId) { + $uidArr = array(); + $allGroups = D('ApiAuthGroupAccess')->select(); + foreach ($allGroups as $allGroup) { + $gidArr = explode(',', $allGroup['groupId']); + if (in_array($groupId, $gidArr)) { + $uidArr[] = $allGroup['uid']; + } + } + if (!empty($uidArr)) { + $res = D('ApiUser')->where(array('api_user.id' => array('in', $uidArr)))->join('api_user_data on api_user.id = api_user_data.uid', 'left')->select(); + } else { + $res = array(); + } + $this->assign('list', $res); + $this->display(); + } else { + $this->ajaxError('非法操作'); + } + } + + /** + * 删除指定组下面的指定用户 + */ + public function delMember() { + if (IS_POST) { + $uid = I('post.uid'); + $groupId = I('post.groupId'); + $oldInfo = D('ApiAuthGroupAccess')->where(array('uid' => $uid))->find(); + $oldGroupArr = explode(',', $oldInfo['groupId']); + $key = array_search($groupId, $oldGroupArr); + unset($oldGroupArr[$key]); + $newData = implode(',', $oldGroupArr); + $res = D('ApiAuthGroupAccess')->where(array('uid' => $uid))->save(array('groupId' => $newData)); + if ($res === false) { + $this->ajaxError(L('_OPERATION_FAIL_')); + } else { + $this->ajaxSuccess(L('_OPERATION_SUCCESS_')); + } + } else { + $this->ajaxError('非法操作'); + } + } + + /** + * 当前用户组权限节点配置 + */ + public function rule() { + if (IS_POST) { + $postData = I('post.'); + $needAdd = array(); + $has = D('ApiAuthRule')->where(array('groupId' => $postData['groupId']))->select(); + $hasRule = array_column($has, 'url'); + $needDel = array_flip($hasRule); + foreach ($postData['rule'] as $key => $value) { + if (!empty($value)) { + if (!in_array($value, $hasRule)) { + $data['url'] = $value; + $data['groupId'] = $postData['groupId']; + $needAdd[] = $data; + } else { + unset($needDel[$value]); + } + } + } + if (count($needAdd)) { + D('ApiAuthRule')->addAll($needAdd); + } + if (count($needDel)) { + $urlArr = array_keys($needDel); + D('ApiAuthRule')->where(array('groupId' => $postData['groupId'], 'url' => array('in', $urlArr)))->delete(); + } + $this->ajaxSuccess('操作成功'); + } elseif (IS_GET) { + $groupId = I('get.group_id'); + $has = D('ApiAuthRule')->where(array('groupId' => $groupId))->select(); + $hasRule = array_column($has, 'url'); + $originList = D('ApiMenu')->order('sort asc')->select(); + $list = listToTree($originList); + $this->assign('hasRule', $hasRule); + $this->assign('list', $list); + $this->display(); + } else { + $this->ajaxError('非法操作'); + } + } + +} \ No newline at end of file diff --git a/Application/Admin/Controller/UserController.class.php b/Application/Admin/Controller/UserController.class.php new file mode 100644 index 0000000..68b2a43 --- /dev/null +++ b/Application/Admin/Controller/UserController.class.php @@ -0,0 +1,91 @@ +<?php +/** + * 用户管理控制器 + * @since 2016-01-21 + * @author zhaoxiang <zhaoxiang051405@outlook.com> + */ + +namespace Admin\Controller; + +class UserController extends BaseController { + + public function index() { + $listInfo = D('ApiUser')->select(); + $userData = D('ApiUserData')->select(); + $userData = $this->buildArrByNewKey($userData, 'uid'); + foreach ($listInfo as $key => $value) { + if ($userData) { + $listInfo[$key]['lastLoginIp'] = long2ip($userData[$value['id']]['lastLoginIp']); + $listInfo[$key]['loginTimes'] = $userData[$value['id']]['loginTimes']; + $listInfo[$key]['lastLoginTime'] = date('Y-m-d H:i:s', $userData[$value['id']]['lastLoginTime']); + } + } + $this->assign('list', $listInfo); + $this->display(); + } + + public function add() { + if (IS_POST) { + $data = I('post.'); + $has = D('ApiUser')->where(array('username' => $data['username']))->count(); + if ($has) { + $this->ajaxError('用户名已经存在,请重设!'); + } + $data['password'] = user_md5($data['password']); + $data['regIp'] = get_client_ip(1); + $data['regTime'] = time(); + $res = D('ApiUser')->add($data); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('添加成功'); + } + } else { + $this->display(); + } + } + + public function close() { + $id = I('post.id'); + $isAdmin = isAdministrator($id); + if ($isAdmin) { + $this->ajaxError('超级管理员不可以被操作'); + } + $res = D('ApiUser')->where(array('id' => $id))->save(array('status' => 0)); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('操作成功'); + } + } + + public function open() { + $id = I('post.id'); + $isAdmin = isAdministrator($id); + if ($isAdmin) { + $this->ajaxError('超级管理员不可以被操作'); + } + $res = D('ApiUser')->where(array('id' => $id))->save(array('status' => 1)); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('操作成功'); + } + } + + public function del() { + $id = I('post.id'); + $isAdmin = isAdministrator($id); + if ($isAdmin) { + $this->ajaxError('超级管理员不可以被操作'); + } + + $res = D('ApiUser')->where(array('id' => $id))->delete(); + if ($res === false) { + $this->ajaxError('操作失败'); + } else { + $this->ajaxSuccess('操作成功'); + } + } + +} \ No newline at end of file diff --git a/Application/Admin/Controller/UserLogController.class.php b/Application/Admin/Controller/UserLogController.class.php new file mode 100644 index 0000000..23df898 --- /dev/null +++ b/Application/Admin/Controller/UserLogController.class.php @@ -0,0 +1,139 @@ +<?php +/** + * 用户日志管理控制器 + * @since 2016-01-25 + * @author zhaoxiang <zhaoxiang051405@outlook.com> + */ +namespace Home\Controller; + +class UserLogController extends HomeController{ + + public function index(){ + $tableField = [ + [ + 'name' => 'actionName', + 'info' => '行为名称', + 'type' => 'text' + ], + [ + 'name' => 'nickName', + 'info' => '执行者', + 'type' => 'text' + ], + [ + 'name' => 'actionTime', + 'info' => '操作时间', + 'type' => 'text' + ], + [ + 'name' => 'actionIp', + 'info' => '操作IP', + 'type' => 'text' + ], + [ + 'name' => 'action', + 'info' => '操作', + 'type' => 'rightButton' + ] + ]; + $typeRule = [ + 'rightButton' => [ + 'action' => [ + [ + 'desc' => '查看', + 'href' => 'UserLog/show', + 'class'=> 'secondary', + 'param'=> '_id', + 'icon' => 'eye', + 'ajax' => 0, + 'show' => '' + ], + [ + 'desc' => '删除', + 'href' => 'UserLog/del', + 'class'=> 'danger', + 'param'=> '_id', + 'icon' => 'trash', + 'ajax' => 2, + 'show' => '' + ] + ] + ] + ]; + $topList = [ + 'topButton' => [ + [ + 'href' => 'UserLog/del', + 'class'=> 'am-btn-danger del-all', + 'title'=> '删除', + 'icon' => 'trash', + 'ajax' => 1, + ], + ] + ]; + $listNum = D('UserAction')->count(); + $listLimit = $this->_getPage($listNum, 20); + $listInfo = D('UserAction')->order('actionTime desc')->limit($listLimit[0],$listLimit[1])->select(); + foreach( $listInfo as $key => $value ){ + $listInfo[$key]['actionTime'] = date('Y-m-d H:i:s', $value['actionTime']); + $listInfo[$key]['actionIp'] = long2ip($value['actionIp']); + } + $this->_prepareListInfo( $listInfo, $tableField, $typeRule ); + $this->_prepareTopList( $topList ); + $this->assign('tableField', $tableField); + $this->display(); + } + + public function show(){ + if( IS_GET ){ + $map['_id'] = I('get._id'); + $res = D('UserAction')->where($map)->find(); + $formData = [ + [ + 'type' => 'text', + 'info' => '行为名称:', + 'attr' => 'disabled', + 'value'=> $res['actionName'], + ], + [ + 'type' => 'text', + 'info' => '执行者:', + 'attr' => 'disabled', + 'value'=> $res['nickName'], + ], + [ + 'type' => 'text', + 'info' => '操作时间:', + 'attr' => 'disabled', + 'value'=> date('Y-m-d H:i:s',$res['actionTime']), + ], + [ + 'type' => 'text', + 'info' => '操作IP:', + 'attr' => 'disabled', + 'value'=> long2ip($res['actionIp']), + ], + [ + 'type' => 'textarea', + 'info' => '受影响的URL:', + 'attr' => 'readonly', + 'value'=> $res['actionUrl'], + ], + [ + 'type' => 'textarea', + 'info' => 'POST数据:', + 'attr' => 'readonly rows="5"', + 'value'=> $res['data'], + ], + ]; + $this->assign('formData', $formData); + $this->display(); + }else{ + $this->error( L('_ERROR_ACTION_') ); + } + } + + public function del(){ + $this->_del('UserAction', $_REQUEST['_id'], 'UserLog/index'); + } +} \ No newline at end of file diff --git a/Application/Admin/Controller/index.html b/Application/Admin/Controller/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Admin/Controller/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Admin/Model/ApiAppModel.class.php b/Application/Admin/Model/ApiAppModel.class.php new file mode 100644 index 0000000..6ea7fe6 --- /dev/null +++ b/Application/Admin/Model/ApiAppModel.class.php @@ -0,0 +1,23 @@ +<?php +/** + * + * @since 2017/03/07 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Model; + + +class ApiAppModel extends BaseModel { + public function open( $where ){ + return $this->where( $where )->save( array('app_status' => 1) ); + } + + public function close( $where ){ + return $this->where( $where )->save( array('app_status' => 0) ); + } + + public function del( $where ){ + return $this->where( $where )->delete(); + } +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiAuthGroupAccessModel.class.php b/Application/Admin/Model/ApiAuthGroupAccessModel.class.php new file mode 100644 index 0000000..cf74531 --- /dev/null +++ b/Application/Admin/Model/ApiAuthGroupAccessModel.class.php @@ -0,0 +1,11 @@ +<?php +/** + * 权限组包含和用户之间的关系表 + * Author: 赵翔 <756958008@qq.com> + * Date: 16/1/16 + */ +namespace Admin\Model; + +class AuthGroupAccessModel extends BaseModel{ + +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiAuthGroupModel.class.php b/Application/Admin/Model/ApiAuthGroupModel.class.php new file mode 100644 index 0000000..aaf7cf8 --- /dev/null +++ b/Application/Admin/Model/ApiAuthGroupModel.class.php @@ -0,0 +1,13 @@ +<?php +/** + * 权限组表模型 + * Author: 赵翔 <756958008@qq.com> + * Date: 16/1/16 + */ +namespace Admin\Model; + +class AuthGroupModel extends BaseModel{ + + + +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiAuthRuleModel.class.php b/Application/Admin/Model/ApiAuthRuleModel.class.php new file mode 100644 index 0000000..3e9f849 --- /dev/null +++ b/Application/Admin/Model/ApiAuthRuleModel.class.php @@ -0,0 +1,12 @@ +<?php +/** + * 权限和URL和Menu的关联表 + * Author: 赵翔 <756958008@qq.com> + * Date: 16/1/16 + */ +namespace Admin\Model; + +class AuthRuleModel extends BaseModel{ + + +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiFieldsInfoModel.class.php b/Application/Admin/Model/ApiFieldsInfoModel.class.php new file mode 100644 index 0000000..7b812b1 --- /dev/null +++ b/Application/Admin/Model/ApiFieldsInfoModel.class.php @@ -0,0 +1,13 @@ +<?php +/** + * + * @since 2017/04/01 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Model; + + +class ApiFieldsInfoModel extends BaseModel { + +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiFieldsModel.class.php b/Application/Admin/Model/ApiFieldsModel.class.php new file mode 100644 index 0000000..05d8612 --- /dev/null +++ b/Application/Admin/Model/ApiFieldsModel.class.php @@ -0,0 +1,13 @@ +<?php +/** + * + * @since 2017/03/09 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Model; + + +class ApiFieldsModel extends BaseModel { + +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiListModel.class.php b/Application/Admin/Model/ApiListModel.class.php new file mode 100644 index 0000000..586a2f7 --- /dev/null +++ b/Application/Admin/Model/ApiListModel.class.php @@ -0,0 +1,23 @@ +<?php +/** + * + * @since 2017/03/07 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Model; + + +class ApiListModel extends BaseModel { + public function open( $where ){ + return $this->where( $where )->save( array('status' => 1) ); + } + + public function close( $where ){ + return $this->where( $where )->save( array('status' => 0) ); + } + + public function del( $where ){ + return $this->where( $where )->delete(); + } +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiMenuModel.class.php b/Application/Admin/Model/ApiMenuModel.class.php new file mode 100644 index 0000000..943cb94 --- /dev/null +++ b/Application/Admin/Model/ApiMenuModel.class.php @@ -0,0 +1,11 @@ +<?php +/** + * 权限和URL和Menu的关联表 + * Author: 赵翔 <756958008@qq.com> + * Date: 16/1/16 + */ +namespace Admin\Model; + +class MenuModel extends BaseModel{ + +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiUserDataModel.class.php b/Application/Admin/Model/ApiUserDataModel.class.php new file mode 100644 index 0000000..7bbb0b6 --- /dev/null +++ b/Application/Admin/Model/ApiUserDataModel.class.php @@ -0,0 +1,10 @@ +<?php +/** + * 用户信息查询 + */ +namespace Admin\Model; + +class UserDataModel extends BaseModel{ + + +} \ No newline at end of file diff --git a/Application/Admin/Model/ApiUserModel.class.php b/Application/Admin/Model/ApiUserModel.class.php new file mode 100644 index 0000000..42e05ab --- /dev/null +++ b/Application/Admin/Model/ApiUserModel.class.php @@ -0,0 +1,10 @@ +<?php +/** + * 用户操作 + */ +namespace Admin\Model; + +class UserModel extends BaseModel{ + + +} \ No newline at end of file diff --git a/Application/Admin/Model/BaseModel.class.php b/Application/Admin/Model/BaseModel.class.php new file mode 100644 index 0000000..f62cdf0 --- /dev/null +++ b/Application/Admin/Model/BaseModel.class.php @@ -0,0 +1,15 @@ +<?php +/** + * + * @since 2017/03/07 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Admin\Model; + + +use Think\Model; + +class BaseModel extends Model { + Protected $autoCheckFields = false; +} \ No newline at end of file diff --git a/Application/Admin/Model/index.html b/Application/Admin/Model/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Admin/Model/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Admin/ORG/Auth.class.php b/Application/Admin/ORG/Auth.class.php new file mode 100644 index 0000000..bf35c18 --- /dev/null +++ b/Application/Admin/ORG/Auth.class.php @@ -0,0 +1,143 @@ +<?php + +namespace Admin\ORG; + +/** + * 权限认证类 + * @since 2016-01-16 + * @author zhaoxiang <zhaoxiang051405@outlook.com> + */ +class Auth { + + protected $_config = array( + 'AUTH_ON' => true, //认证开关 + 'AUTH_TYPE' => 1, //认证方式,1为时时认证;2为登录认证。 + 'AUTH_GROUP' => 'ApiAuthGroup', //用户组数据表名 + 'AUTH_GROUP_ACCESS' => 'ApiAuthGroupAccess', //用户组明细表 + 'AUTH_RULE' => 'ApiAuthRule', //权限规则表 + 'AUTH_USER' => 'ApiUser' //用户信息表 + ); + + public function __construct() { + $conf = C('AUTH_CONFIG'); + if ($conf) { + $together = array_intersect_key($conf, $this->_config); + $this->_config = array_merge($this->_config, $together); + } + } + + /** + * 权限检测 + * @param string | array $name 获得权限 可以是字符串或数组或逗号分割,只要数组中有一个条件通过则通过 + * @param string $uid 认证的用户id + * @param string $relation + * @return bool + */ + public function check($name, $uid, $relation = 'or') { + + if (!$this->_config['AUTH_ON']) { + return true; + } + + $authList = $this->getAuthList($uid); + if (is_string($name)) { + if (strpos($name, ',') !== false) { + $name = explode(',', $name); + } else { + $name = array($name); + } + } + + $list = array(); + foreach ($authList as $val) { + if (in_array($val, $name)) + $list[] = $val; + } + + if ($relation == 'or' && !empty($list)) { + return true; + } + $diff = array_diff($name, $list); + if ($relation == 'and' && empty($diff)) { + return true; + } + + return false; + } + + /** + * 获取用户组信息 + * @param $uid + * @return mixed + */ + protected function getGroups($uid) { + static $groups = array(); + if (isset($groups[$uid])) { + return $groups[$uid]; + } + $ids = array();$userGroups = array(); + $group_access = D($this->_config['AUTH_GROUP_ACCESS'])->where(array('uid' => $uid))->find(); + if($group_access){ + $groupInfoArr = D($this->_config['AUTH_GROUP'])->where(array('id' => array('in', $group_access['groupId'])))->select(); + foreach ($groupInfoArr as $value) { + if ($value['status'] == 1) { + $ids[] = $value['id']; + $userGroups[] = $value; + } + } + } + + $groups[$uid]['detail'] = $userGroups; //包含组全部信息 + $groups[$uid]['id'] = $ids; //只包含组ID信息 + + return $groups[$uid]; + } + + /** + * 获取权限列表 + * @param $uid + * @return array + */ + public function getAuthList($uid) { + + static $_authList = array(); + if (isset($_authList[$uid])) { + return $_authList[$uid]; + } + if (isset($_SESSION[$uid]['_AUTH_LIST_'])) { + return $_SESSION[$uid]['_AUTH_LIST_']; + } + + $groups = $this->getGroups($uid); + if (empty($groups['id'])) { + $_authList[$uid] = array(); + + return array(); + } + + $rules = D($this->_config['AUTH_RULE'])->where(array( + 'groupId' => array('in', $groups['id']), + 'status' => 1 + ))->select(); + $rules = array_column($rules, 'url'); + $rules = array_unique($rules); + if (empty($rules)) { + $_authList[$uid] = array(); + + return array(); + } + + $authList = array(); + foreach ($rules as $r) { + $authList[] = strtolower($r); + } + + $_authList[$uid] = $authList; + if ($this->_config['AUTH_TYPE'] == 2) { + $_SESSION[$uid]['_AUTH_LIST_'] = $authList; + } + + return $_authList[$uid]; + } + +} \ No newline at end of file diff --git a/Application/Admin/Tpl/exception.tpl b/Application/Admin/Tpl/exception.tpl new file mode 100644 index 0000000..9986743 --- /dev/null +++ b/Application/Admin/Tpl/exception.tpl @@ -0,0 +1,33 @@ +<?php + if(C('LAYOUT_ON')) { + echo '{__NOLAYOUT__}'; + } +?> +<!doctype html> +<html lang="zh"> +<head> + <meta charset="UTF-8"> + <title><?php echo C('APP_NAME') ?> - 系统发生错误</title> + <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.css"> + <script src="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.js"></script> +</head> +<body> +<div class="ui very padded piled red text container segment" style="margin-top:3%; max-width: none !important;"> + <h1 class="ui orange header huge"><i class="warning sign icon"></i></h1> + <h2 class="ui header huge"><?php echo strip_tags($e['message']);?></h2> + <?php if(isset($e['file'])) {?> + <h4>错误位置</h4> + <p>FILE: <?php echo $e['file'] ;?>  LINE: <?php echo $e['line'];?></p> + <?php }?> + <?php if(isset($e['trace'])) {?> + <h4>TRACE</h4> + <p><?php echo nl2br($e['trace']);?></p> + <?php }?> + <div class="ui clearing divider"></div> + <div class="ui right aligned container"> + <p><a href=""><?php echo C('APP_NAME') ?></a><sup><?php echo C('APP_VERSION') ?></sup> { Fast & Simple API Framework } -- [ MANAGE YOUR API EASY ]</p> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/Application/Admin/Tpl/jump.tpl b/Application/Admin/Tpl/jump.tpl new file mode 100644 index 0000000..13dd311 --- /dev/null +++ b/Application/Admin/Tpl/jump.tpl @@ -0,0 +1,63 @@ +<?php + if(C('LAYOUT_ON')) { + echo '{__NOLAYOUT__}'; + } +?> +<!doctype html> +<html lang="zh"> +<head> + <meta charset="UTF-8"> + <title><?php echo C('APP_NAME') ?> - 跳转提示</title> + <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.css"> + <script src="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.js"></script> +</head> +<body> + + <div class="ui card" style="text-align:center;width:40%;position: fixed;top: 20%;left: 30%"> + <?php if(isset($message)) {?> + <div class="ui green inverted segment" style="margin: 0px;"> + <i class="ui check circle icon massive"></i> + </div> + <?php }else{?> + <div class="ui red inverted segment" style="margin: 0px;"> + <i class="ui remove circle icon massive"></i> + </div> + <?php }?> + <div class="content" style="line-height: 2em"> + <?php if(isset($message)) {?> + <span class="header"><?php echo($message); ?></span> + <?php }else{?> + <span class="header"><?php echo($error); ?></span> + <?php }?> + <div class="meta"> + 将在<span id="left"><?php echo($waitSecond); ?></span>S后自动跳转 + </div> + </div> + <span style="display: none" id="href"><?php echo($jumpUrl); ?></span> + <div class="ui bottom attached indicating progress" id="amanege-bar"> + <div class="bar"></div> + </div> + </div> +</body> +<script type="text/javascript"> + (function(){ + var wait = 0,left = $('#left').text(); + var href = $('#href').text(); + var each = 100/left; + var interval = setInterval(function(){ + wait = wait + each; + left = left - 1; + if(wait > 100) { + location.href = href; + clearInterval(interval); + return ; + } + $('#left').text(left); + $('#amanege-bar').progress({ + percent: wait + }); + }, 1000); + })(); +</script> +</html> \ No newline at end of file diff --git a/Application/Admin/View/ApiManage/add.html b/Application/Admin/View/ApiManage/add.html new file mode 100644 index 0000000..cea7c39 --- /dev/null +++ b/Application/Admin/View/ApiManage/add.html @@ -0,0 +1,182 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>接口管理 - 新增接口</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <div class="layui-form-item"> + <label class="layui-form-label">接口名称</label> + <div class="layui-input-block"> + <input type="text" name="apiName" required value="{:(isset($detail['apiName'])?$detail['apiName']:'')}" lay-verify="required" placeholder="请输入应用名称" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">请求方式</label> + <div class="layui-input-inline"> + <select name="method"> + <switch name="detail['method']" > + <case value="0" break="1"> + <option value="1">POST</option> + <option value="2">GET</option> + <option value="0" selected>不限</option> + </case> + <case value="1" break="1"> + <option value="1" selected>POST</option> + <option value="2">GET</option> + <option value="0">不限</option> + </case> + <case value="2" break="1"> + <option value="1">POST</option> + <option value="2" selected>GET</option> + <option value="0">不限</option> + </case> + <default /> + <option value="1">POST</option> + <option value="2">GET</option> + <option value="0">不限</option> + </switch> + </select> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">接口映射</label> + <div class="layui-input-inline"> + <input name="hash" value="{$detail['hash']}" readonly class="layui-input"> + </div> + <div class="layui-form-mid layui-word-aux">系统自动生成,不允许修改</div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">AccessToken</label> + <div class="layui-input-inline"> + <select name="accessToken"> + <switch name="detail['accessToken']" > + <case value="0" break="1"> + <option value="1">验证Token</option> + <option value="0" selected>忽略Token</option> + </case> + <case value="1" break="1"> + <option value="1" selected>验证Token</option> + <option value="0">忽略Token</option> + </case> + <default /> + <option value="1">验证Token</option> + <option value="0">忽略Token</option> + </switch> + </select> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">用户登录</label> + <div class="layui-input-inline"> + <select name="needLogin"> + <switch name="detail['needLogin']" > + <case value="0" break="1"> + <option value="1">验证登录</option> + <option value="0" selected>忽略登录</option> + </case> + <case value="1" break="1"> + <option value="1" selected>验证登录</option> + <option value="0">忽略登录</option> + </case> + <default /> + <option value="1">验证登录</option> + <option value="0">忽略登录</option> + </switch> + </select> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">测试模式</label> + <div class="layui-input-inline"> + <select name="isTest"> + <switch name="detail['isTest']" > + <case value="0" break="1"> + <option value="1">开启测试</option> + <option value="0" selected>关闭测试</option> + </case> + <case value="1" break="1"> + <option value="1" selected>开启测试</option> + <option value="0">关闭测试</option> + </case> + <default /> + <option value="0">关闭测试</option> + <option value="1">开启测试</option> + </switch> + </select> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">应用描述</label> + <div class="layui-input-block"> + <textarea name="info" placeholder="请输入内容" class="layui-textarea">{:(isset($detail['info'])?$detail['info']:'')}</textarea> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("edit")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + <else /> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("add")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + </if> +</block> \ No newline at end of file diff --git a/Application/Admin/View/ApiManage/index.html b/Application/Admin/View/ApiManage/index.html new file mode 100644 index 0000000..e4ad516 --- /dev/null +++ b/Application/Admin/View/ApiManage/index.html @@ -0,0 +1,119 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>应用管理 - API列表</legend> + <div class="layui-field-box"> + <span class="layui-btn layui-btn-normal api-add"><i class="layui-icon"></i> 新增</span> + <a class="layui-btn layui-btn-warm" href="{:U('/wikiList')}" target="_blank"><i class="layui-icon"></i> 接口文档</a> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th width="10%">接口名称</th> + <th width="10%">接口映射</th> + <th width="10%">接口状态</th> + <th width="10%">请求方式</th> + <th width="20%">接口说明</th> + <th width="40%">操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['apiName']}</td> + <td>{$vo['hash']}</td> + <td> + <if condition="$vo['status']"> + <span style="border-radius: 2px;background-color: #5FB878;padding:5px 10px;color: #ffffff">生效</span> + <else /> + <span style="border-radius: 2px;background-color: #FF5722;padding:5px 10px;color: #ffffff">禁用</span> + </if> + </td> + <td> + <switch name="vo['method']" > + <case value="0" break="1"> + <span style="border-radius: 2px;background-color: #009688;padding:5px 10px;color: #ffffff">不限</span> + </case> + <case value="1" break="1"> + <span style="border-radius: 2px;background-color: #2F4056;padding:5px 10px;color: #ffffff">POST</span> + </case> + <case value="2" break="1"> + <span style="border-radius: 2px;background-color: #01AAED;padding:5px 10px;color: #ffffff">GET</span> + </case> + </switch> + </td> + <td>{$vo['info']}</td> + <td> + <if condition="$vo['status']"> + <span class="layui-btn layui-btn-danger confirm" data-info="你确定禁用当前API么?" data-id="{$vo['id']}" data-url="{:U('close')}">禁用</span> + <else /> + <span class="layui-btn confirm" data-info="你确定启用当前API么?" data-id="{$vo['id']}" data-url="{:U('open')}">启用</span> + </if> + <span data-url="{:U('FieldsManage/request', array('hash' => $vo['hash']))}" class="layui-btn field layui-btn-primary">请求参数</span> + <span data-url="{:U('edit', array('id' => $vo['id']))}" class="layui-btn edit layui-btn-normal">编辑</span> + <span data-url="{:U('FieldsManage/response', array('hash' => $vo['hash']))}" class="layui-btn field layui-btn-warm">返回参数</span> + <span class="layui-btn layui-btn-danger confirm" data-id="{$vo['id']}" data-info="你确定删除当前API么?" data-url="{:U('del')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.api-add').on('click', function () { + layer.open({ + type: 2, + area: ['60%', '80%'], + maxmin: true, + content: '{:U("add")}' + }); + }); + $('.edit').on('click', function () { + var ownObj = $(this); + layer.open({ + type: 2, + area: ['60%', '80%'], + maxmin: true, + content: ownObj.attr('data-url') + }); + }); + $('.field').on('click', function () { + var ownObj = $(this); + layer.open({ + type: 2, + area: ['90%', '90%'], + maxmin: true, + content: ownObj.attr('data-url') + }); + }); + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/App/add.html b/Application/Admin/View/App/add.html new file mode 100644 index 0000000..d6219c6 --- /dev/null +++ b/Application/Admin/View/App/add.html @@ -0,0 +1,101 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>应用管理 - 新增应用</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <div class="layui-form-item"> + <label class="layui-form-label">应用名称</label> + <div class="layui-input-block"> + <input type="text" name="app_name" required value="{:(isset($detail['app_name'])?$detail['app_name']:'')}" lay-verify="required" placeholder="请输入应用名称" class="layui-input"> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">AppId</label> + <div class="layui-input-inline" style="width: 300px;"> + <input name="app_id" value="{$detail['app_id']}" readonly class="layui-input"> + </div> + <div class="layui-form-mid layui-word-aux">系统自动生成,不允许修改</div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">AppSecret</label> + <div class="layui-input-inline" style="width: 300px;"> + <input name="app_secret" value="{$detail['app_secret']}" readonly class="layui-input"> + </div> + <div class="layui-form-mid layui-word-aux">系统自动生成,不允许修改</div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">应用描述</label> + <div class="layui-input-block"> + <textarea name="app_info" placeholder="请输入内容" class="layui-textarea">{:(isset($detail['app_info'])?$detail['app_info']:'')}</textarea> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("edit")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + <else /> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("add")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + </if> +</block> \ No newline at end of file diff --git a/Application/Admin/View/App/index.html b/Application/Admin/View/App/index.html new file mode 100644 index 0000000..d275362 --- /dev/null +++ b/Application/Admin/View/App/index.html @@ -0,0 +1,95 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>应用管理 - 应用列表</legend> + <div class="layui-field-box"> + <span class="layui-btn layui-btn-normal api-add"><i class="layui-icon"></i> 新增</span> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th>应用名称</th> + <th>AppId</th> + <th>AppSecret</th> + <th>应用说明</th> + <th>应用状态</th> + <th>操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['app_name']}</td> + <td>{$vo['app_id']}</td> + <td>{$vo['app_secret']}</td> + <td>{$vo['app_info']}</td> + <td> + <if condition="$vo['app_status']"> + <span style="border-radius: 2px;background-color: #5FB878;padding:5px 10px;color: #ffffff">生效</span> + <else /> + <span style="border-radius: 2px;background-color: #FF5722;padding:5px 10px;color: #ffffff">禁用</span> + </if> + </td> + <td> + <if condition="$vo['app_status']"> + <span class="layui-btn layui-btn-danger confirm" data-info="你确定禁用当前APP么?" data-id="{$vo['id']}" data-url="{:U('close')}">禁用</span> + <else /> + <span class="layui-btn confirm" data-info="你确定启用当前APP么?" data-id="{$vo['id']}" data-url="{:U('open')}">启用</span> + </if> + <span data-url="{:U('edit', array('id' => $vo['id']))}" class="layui-btn edit layui-btn-normal">编辑</span> + <span class="layui-btn layui-btn-danger confirm" data-id="{$vo['id']}" data-info="你确定删除当前APP么?" data-url="{:U('del')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.api-add').on('click', function () { + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: '{:U("add")}' + }); + }); + $('.edit').on('click', function () { + var ownObj = $(this); + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: ownObj.attr('data-url') + }); + }); + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/FieldsInfoManage/add.html b/Application/Admin/View/FieldsInfoManage/add.html new file mode 100644 index 0000000..0dc725f --- /dev/null +++ b/Application/Admin/View/FieldsInfoManage/add.html @@ -0,0 +1,129 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>接口管理 - {:(I('get.id')?'编辑':'新增')}{:(I('get.type') == 1?'返回':'请求')}字段</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <input type="hidden" name="hash" value="{:(isset($detail['hash'])?$detail['hash']:I('get.hash'))}"> + <input type="hidden" name="type" value="{:(isset($detail['type'])?$detail['type']:I('get.type'))}"> + <div class="layui-form-item"> + <label class="layui-form-label">字段名称</label> + <div class="layui-input-block"> + <input type="text" name="showName" required value="{:(isset($detail['showName'])?$detail['showName']:'')}" lay-verify="required" placeholder="请输入字段名称" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">数据类型</label> + <div class="layui-input-inline"> + <select name="dataType"> + <volist name="dataType" id="vo"> + <if condition="(isset($detail['dataType'])) AND ($key eq $detail['dataType'])"> + <option value="{$key}" selected>{$vo}</option> + <else /> + <option value="{$key}">{$vo}</option> + </if> + + </volist> + </select> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">默认值</label> + <div class="layui-input-block"> + <input name="default" value="{$detail['default']}" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">是否必填</label> + <div class="layui-input-block"> + <if condition="(isset($detail['isMust'])) AND ($detail['isMust'] eq 0) "> + <input type="radio" name="isMust" value="1" title="必填"> + <input type="radio" name="isMust" value="0" title="不必填" checked> + <else /> + <input type="radio" name="isMust" value="1" title="必填" checked> + <input type="radio" name="isMust" value="0" title="不必填"> + </if> + + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">规则细节</label> + <div class="layui-input-block"> + <textarea name="range" placeholder="请输入符合要求的JSON字符串" class="layui-textarea">{:(isset($detail['range'])?$detail['range']:'')}</textarea> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">字段说明</label> + <div class="layui-input-block"> + <textarea name="info" placeholder="请输入内容" class="layui-textarea">{:(isset($detail['info'])?$detail['info']:'')}</textarea> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> + <button onclick="history.go(-1);" class="layui-btn layui-btn-primary">返回</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("edit")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + location.href = "{:(I('get.type') == 1?U('response', array('hash' => $detail['hash'])):U('request', array('hash' => $detail['hash'])))}"; + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + <else /> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("add")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + location.href = "{:(I('get.type') == 1?U('response', array('hash' => I('get.hash'))):U('request', array('hash' => I('get.hash'))))}"; + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + </if> +</block> \ No newline at end of file diff --git a/Application/Admin/View/FieldsInfoManage/index.html b/Application/Admin/View/FieldsInfoManage/index.html new file mode 100644 index 0000000..d881c48 --- /dev/null +++ b/Application/Admin/View/FieldsInfoManage/index.html @@ -0,0 +1,61 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>接口管理 - {:($type == 1?'返回':'请求')}字段列表</legend> + <div class="layui-field-box"> + <a class="layui-btn layui-btn-normal" href='{:U("add")}'><i class="layui-icon"></i> 新增</a> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th>字段名称</th> + <th>字段说明</th> + <th width="150px">操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['field']}</td> + <td>{$vo['info']}</td> + <td> + <a href="{:U('edit', array('id' => $vo['id']))}" class="layui-btn layui-btn-normal">编辑</a> + <span class="layui-btn layui-btn-danger confirm" data-id="{$vo['id']}" data-info="你确定删除当前字段么?" data-url="{:U('del')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/FieldsInfoManage/upload.html b/Application/Admin/View/FieldsInfoManage/upload.html new file mode 100644 index 0000000..785e3cf --- /dev/null +++ b/Application/Admin/View/FieldsInfoManage/upload.html @@ -0,0 +1,94 @@ +<extend name="Public/base" /> +<block name="main"> + <link rel="stylesheet" href="__PUBLIC__/jsonFormater/jsonFormater.css"> + <script type="text/javascript" src="__PUBLIC__/jsonFormater/jsonFormater.js"></script> + <fieldset class="layui-elem-field"> + <legend>接口管理 - 返回字段[批量覆盖]</legend> + <div class="layui-field-box"> + <form class="layui-form"> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <input type="hidden" name="hash" value="{:(isset($detail['hash'])?$detail['hash']:I('get.hash'))}"> + <input type="hidden" name="type" value="{:(isset($detail['type'])?$detail['type']:I('get.type'))}"> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">数据模版</label> + <div class="layui-input-block"> + <textarea name="jsonStr" required id="RawJson" rows="7" placeholder="请输入内容" class="layui-textarea"></textarea> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <span class="layui-btn layui-btn-danger" id="format">JSON格式化</span> + <span class="layui-btn layui-btn-normal" id="collapseAll">全部收起</span> + <span class="layui-btn layui-btn-warm" id="expandAll">全部展开</span> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">格式化数据</label> + <div class="layui-input-block"> + <pre style="max-height: 300px;overflow: auto;" class="layui-code" id="Canvas"></pre> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> + <button onclick="history.go(-1);" class="layui-btn layui-btn-primary">返回</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + $(document).ready(function () { + var format = function () { + var options = { + dom: '#Canvas', + isCollapsible: true, + quoteKeys: true, + tabSize: 2, + imgCollapsed: "__PUBLIC__/images/jsonFormater/Collapsed.gif", + imgExpanded: "__PUBLIC__/images/jsonFormater/Expanded.gif" + }; + window.jf = new JsonFormater(options); + jf.doFormat($('#RawJson').val()); + }; + $('#format').click(function () { + format(); + }); + $('#expandAll').click(function () { + window.jf.expandAll(); + }); + $('#collapseAll').click(function () { + window.jf.collapseLevel(2); + }); + + + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("upload")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + location.href = "{:(I('get.type') == 1?U('response', array('hash' => I('get.hash'))):U('request', array('hash' => I('get.hash'))))}"; + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/FieldsManage/add.html b/Application/Admin/View/FieldsManage/add.html new file mode 100644 index 0000000..0dc725f --- /dev/null +++ b/Application/Admin/View/FieldsManage/add.html @@ -0,0 +1,129 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>接口管理 - {:(I('get.id')?'编辑':'新增')}{:(I('get.type') == 1?'返回':'请求')}字段</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <input type="hidden" name="hash" value="{:(isset($detail['hash'])?$detail['hash']:I('get.hash'))}"> + <input type="hidden" name="type" value="{:(isset($detail['type'])?$detail['type']:I('get.type'))}"> + <div class="layui-form-item"> + <label class="layui-form-label">字段名称</label> + <div class="layui-input-block"> + <input type="text" name="showName" required value="{:(isset($detail['showName'])?$detail['showName']:'')}" lay-verify="required" placeholder="请输入字段名称" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">数据类型</label> + <div class="layui-input-inline"> + <select name="dataType"> + <volist name="dataType" id="vo"> + <if condition="(isset($detail['dataType'])) AND ($key eq $detail['dataType'])"> + <option value="{$key}" selected>{$vo}</option> + <else /> + <option value="{$key}">{$vo}</option> + </if> + + </volist> + </select> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">默认值</label> + <div class="layui-input-block"> + <input name="default" value="{$detail['default']}" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">是否必填</label> + <div class="layui-input-block"> + <if condition="(isset($detail['isMust'])) AND ($detail['isMust'] eq 0) "> + <input type="radio" name="isMust" value="1" title="必填"> + <input type="radio" name="isMust" value="0" title="不必填" checked> + <else /> + <input type="radio" name="isMust" value="1" title="必填" checked> + <input type="radio" name="isMust" value="0" title="不必填"> + </if> + + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">规则细节</label> + <div class="layui-input-block"> + <textarea name="range" placeholder="请输入符合要求的JSON字符串" class="layui-textarea">{:(isset($detail['range'])?$detail['range']:'')}</textarea> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">字段说明</label> + <div class="layui-input-block"> + <textarea name="info" placeholder="请输入内容" class="layui-textarea">{:(isset($detail['info'])?$detail['info']:'')}</textarea> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> + <button onclick="history.go(-1);" class="layui-btn layui-btn-primary">返回</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("edit")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + location.href = "{:(I('get.type') == 1?U('response', array('hash' => $detail['hash'])):U('request', array('hash' => $detail['hash'])))}"; + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + <else /> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("add")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + location.href = "{:(I('get.type') == 1?U('response', array('hash' => I('get.hash'))):U('request', array('hash' => I('get.hash'))))}"; + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + </if> +</block> \ No newline at end of file diff --git a/Application/Admin/View/FieldsManage/index.html b/Application/Admin/View/FieldsManage/index.html new file mode 100644 index 0000000..7e1d526 --- /dev/null +++ b/Application/Admin/View/FieldsManage/index.html @@ -0,0 +1,78 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>接口管理 - {:($type == 1?'返回':'请求')}字段列表</legend> + <div class="layui-field-box"> + <a class="layui-btn layui-btn-normal" href='{:U("add", array("hash" => I("get.hash"), "type" => $type))}'><i class="layui-icon"></i> 新增</a> + <if condition="$type eq 1"> + <a class="layui-btn layui-btn-warm" href='{:U("upload", array("hash" => I("get.hash"), "type" => $type))}'><i class="layui-icon"></i> 上传</a> + </if> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th>字段名称</th> + <th>数据类型</th> + <th>是否必须</th> + <th width="50px">默认值</th> + <th width="35%">字段说明</th> + <th>操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['showName']}</td> + <td> + <span style="border-radius: 2px;background-color: #009688;padding:5px 10px;color: #ffffff">{$dataType[$vo['dataType']]}</span> + </td> + <td> + <if condition="$vo['isMust']"> + <span style="border-radius: 2px;background-color: #5FB878;padding:5px 10px;color: #ffffff">必须</span> + <else /> + <span style="border-radius: 2px;background-color: #FF5722;padding:5px 10px;color: #ffffff">不必须</span> + </if> + </td> + <td>{$vo['default']}</td> + <td>{$vo['info']}</td> + <td> + <a href="{:U('edit', array('id' => $vo['id'], 'type' => $type))}" class="layui-btn layui-btn-normal">编辑</a> + <span class="layui-btn layui-btn-danger confirm" data-id="{$vo['id']}" data-info="你确定删除当前字段么?" data-url="{:U('del')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/FieldsManage/upload.html b/Application/Admin/View/FieldsManage/upload.html new file mode 100644 index 0000000..785e3cf --- /dev/null +++ b/Application/Admin/View/FieldsManage/upload.html @@ -0,0 +1,94 @@ +<extend name="Public/base" /> +<block name="main"> + <link rel="stylesheet" href="__PUBLIC__/jsonFormater/jsonFormater.css"> + <script type="text/javascript" src="__PUBLIC__/jsonFormater/jsonFormater.js"></script> + <fieldset class="layui-elem-field"> + <legend>接口管理 - 返回字段[批量覆盖]</legend> + <div class="layui-field-box"> + <form class="layui-form"> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <input type="hidden" name="hash" value="{:(isset($detail['hash'])?$detail['hash']:I('get.hash'))}"> + <input type="hidden" name="type" value="{:(isset($detail['type'])?$detail['type']:I('get.type'))}"> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">数据模版</label> + <div class="layui-input-block"> + <textarea name="jsonStr" required id="RawJson" rows="7" placeholder="请输入内容" class="layui-textarea"></textarea> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <span class="layui-btn layui-btn-danger" id="format">JSON格式化</span> + <span class="layui-btn layui-btn-normal" id="collapseAll">全部收起</span> + <span class="layui-btn layui-btn-warm" id="expandAll">全部展开</span> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">格式化数据</label> + <div class="layui-input-block"> + <pre style="max-height: 300px;overflow: auto;" class="layui-code" id="Canvas"></pre> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> + <button onclick="history.go(-1);" class="layui-btn layui-btn-primary">返回</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + $(document).ready(function () { + var format = function () { + var options = { + dom: '#Canvas', + isCollapsible: true, + quoteKeys: true, + tabSize: 2, + imgCollapsed: "__PUBLIC__/images/jsonFormater/Collapsed.gif", + imgExpanded: "__PUBLIC__/images/jsonFormater/Expanded.gif" + }; + window.jf = new JsonFormater(options); + jf.doFormat($('#RawJson').val()); + }; + $('#format').click(function () { + format(); + }); + $('#expandAll').click(function () { + window.jf.expandAll(); + }); + $('#collapseAll').click(function () { + window.jf.collapseLevel(2); + }); + + + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(formDemo)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("upload")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + location.href = "{:(I('get.type') == 1?U('response', array('hash' => I('get.hash'))):U('request', array('hash' => I('get.hash'))))}"; + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Index/index.html b/Application/Admin/View/Index/index.html new file mode 100644 index 0000000..8fe10e9 --- /dev/null +++ b/Application/Admin/View/Index/index.html @@ -0,0 +1,118 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> + <title>{:C('APP_NAME')}管理后台</title> + <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> + <link rel="stylesheet" href="__PUBLIC__/layui/css/layui.css"> +</head> + +<body> +<!-- 布局容器 --> +<div class="layui-layout layui-layout-admin"> + <!-- 头部 --> + <div class="layui-header"> + <div class="layui-main"> + <!-- logo --> + <a href="/" style="color: #c2c2c2; font-size: 18px; line-height: 60px;">{:C('APP_NAME')}管理后台</a> + <!-- 水平导航 --> + <ul class="layui-nav" style="position: absolute; top: 0; right: 0; background: none;"> + <li class="layui-nav-item"> + <a href="javascript:;"> + 进入前台 + </a> + </li> + <li class="layui-nav-item"> + <a href="javascript:;"> + 管理员 + </a> + <dl class="layui-nav-child"> + <dd class="api-add"> + <a href="javascript:;"> + 个人信息 + </a> + </dd> + <dd> + <a href="{:U('Login/logOut')}"> + 退出登录 + </a> + </dd> + </dl> + </li> + </ul> + </div> + </div> + + <!-- 侧边栏 --> + <div class="layui-side layui-bg-black"> + <div class="layui-side-scroll"> + <ul class="layui-nav layui-nav-tree" lay-filter="left-nav" style="border-radius: 0;"> + </ul> + </div> + </div> + + <!-- 主体 --> + <div class="layui-body"> + <!-- 顶部切换卡 --> + <div class="layui-tab layui-tab-brief" lay-filter="top-tab" lay-allowClose="true" style="margin: 0;"> + <ul class="layui-tab-title"></ul> + <div class="layui-tab-content"></div> + </div> + </div> + + <!-- 底部 --> + <div class="layui-footer" style="text-align: center; line-height: 44px;"> + <strong>Copyright © 2014-{:date('Y')} <a href="">{:C('COMPANY_NAME')}</a>.</strong> All rights reserved. + </div> +</div> + +<script type="text/javascript" src="__PUBLIC__/layui/layui.js"></script> +<script type="text/javascript"> + layui.config({ + base: '__PUBLIC__/js/' + }); + + layui.use(['cms'], function() { + var cms = layui.cms('left-nav', 'top-tab'); + cms.addNav(JSON.parse('{:json_encode($list)}'), 0, 'id', 'fid', 'name', 'url'); + cms.bind(60 + 41 + 20 + 44); //头部高度 + 顶部切换卡标题高度 + 顶部切换卡内容padding + 底部高度 + cms.clickLI(0); + }); + + layui.use(['layer'], function() { + $('.api-add').on('click', function () { + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: '{:U("Login/changeUser")}' + }); + }); + var updateTime = '{$userInfo["updateTime"]}'; + if( updateTime == 0 ){ + layer.open({ + title: '初次登陆请重置密码!', + type: 2, + area: ['60%', '60%'], + maxmin: true, + closeBtn:0, + content: '{:U("Login/changeUser")}' + }); + }else{ + var nickname = '{$userInfo["nickname"]}'; + if( !nickname ){ + layer.open({ + title: '初次登陆请补充真实姓名!', + type: 2, + area: ['60%', '60%'], + maxmin: true, + closeBtn:0, + content: '{:U("Login/changeUser")}' + }); + } + } + }); +</script> +</body> +</html> \ No newline at end of file diff --git a/Application/Admin/View/Index/welcome.html b/Application/Admin/View/Index/welcome.html new file mode 100644 index 0000000..a9bfefb --- /dev/null +++ b/Application/Admin/View/Index/welcome.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Title</title> +</head> +<body> +Welcome +</body> +</html> \ No newline at end of file diff --git a/Application/Admin/View/Log/index.html b/Application/Admin/View/Log/index.html new file mode 100644 index 0000000..2316352 --- /dev/null +++ b/Application/Admin/View/Log/index.html @@ -0,0 +1,162 @@ +<extend name="Public/base" /> +<block name="main"> + <script type="text/javascript" src="__PUBLIC__/dataTable/jquery.dataTables.min.js"></script> + <link rel="stylesheet" href="__PUBLIC__/css/dataTable.css"> + <fieldset class="layui-elem-field"> + <legend>日志列表</legend> + <div class="layui-field-box"> + <form class="layui-form" id="form-admin-add" action=""> + <div class="layui-form-item"> + <div class="layui-inline"> + <select name="type"> + <option value="">请选择查询方式</option> + <option value="1">操作URL</option> + <option value="2">用户昵称</option> + <option value="3">用户ID</option> + </select> + </div> + <div class="layui-inline"> + <div class="layui-input-inline" style="width: 300px;"> + <input type="text" name="keyword" placeholder="请输入关键词" class="layui-input"> + </div> + </div> + <div class="layui-inline"> + <span class="layui-btn sub">查询</span> + </div> + </div> + </form> + <table class="layui-table" id="list-admin" lay-even> + <thead> + <tr> + <th>行为名称</th> + <th>用户ID</th> + <th>用户昵称</th> + <th>操作URL</th> + <th>执行时间</th> + <th>操作</th> + </tr> + </thead> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + /** + * 格式化时间戳 + * @param fmt + * @returns {*} + * @constructor + */ + Date.prototype.Format = function (fmt) { + var o = { + "M+": this.getMonth() + 1, //月份 + "d+": this.getDate(), //日 + "h+": this.getHours(), //小时 + "m+": this.getMinutes(), //分 + "s+": this.getSeconds(), //秒 + "q+": Math.floor((this.getMonth() + 3) / 3), //季度 + "S": this.getMilliseconds() //毫秒 + }; + if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); + for (var k in o) + if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); + return fmt; + }; + + layui.use(['layer', 'form'], function() { + $(document).on('click', '.confirm', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + + $(document).on('click', '.edit', function () { + var ownObj = $(this); + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: ownObj.attr('data-url')+'&id='+ownObj.attr('data-id') + }); + }); + + var myFun = function (query) { + query = query || ''; + return $('#list-admin').DataTable({ + ordering: false, + autoWidth: false, + searching:false, + serverSide: true, + ajax: { + url:'{:U("ajaxGetIndex")}' + query, + type: 'POST', + dataSrc: function ( json ) { + if( json.code == 0 ){ + parent.layer.msg(json.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + }else{ + return json.data; + } + } + }, + columnDefs:[ + { + "targets":4, + "render": function(data){ + return new Date(data*1000).Format("yyyy-MM-dd hh:mm:ss"); + } + }, + { + "targets":5, + "render":function(data, type, row){ + var returnStr = ''; + returnStr += '<span class="layui-btn edit layui-btn-normal" ' + + 'data-id="' + row.id +'" data-url="{:U(\'showDetail\')}">查看</span>'; + returnStr += '<span class="layui-btn layui-btn-danger confirm" ' + + 'data-id="' + row.id +'" data-info="你确定删除当前菜单么?" data-url="{:U(\'del\')}">删除</span>'; + return returnStr; + } + } + ], + iDisplayLength : 20, + aLengthMenu : [20, 30, 50], + columns: [ + {"data": "actionName"}, + {"data": "uid"}, + {"data": "nickname" }, + {"data": "url" }, + {"data": "addTime" }, + {"data": null } + ] + }); + }; + var myTable = myFun(); + $('.sub').on("click", function(){ + myTable.destroy(); + myTable = myFun('&'+ $('#form-admin-add').serialize()); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Log/showDetail.html b/Application/Admin/View/Log/showDetail.html new file mode 100644 index 0000000..ff89ab4 --- /dev/null +++ b/Application/Admin/View/Log/showDetail.html @@ -0,0 +1,51 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>日志详情</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <div class="layui-form-item"> + <label class="layui-form-label">行为名称</label> + <div class="layui-input-block"> + <input disabled type="text" value="{:(isset($detail['actionName'])?$detail['actionName']:'')}" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">操作用户ID</label> + <div class="layui-input-block"> + <input disabled type="text" value="{:(isset($detail['uid'])?$detail['uid']:'')}" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">用户昵称</label> + <div class="layui-input-block"> + <input disabled type="text" value="{:(isset($detail['nickname'])?$detail['nickname']:'')}" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">操作时间</label> + <div class="layui-input-block"> + <input disabled type="text" value="{:(isset($detail['addTime'])?date('Y-m-d H:i:s', $detail['addTime']):'')}" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">操作URL</label> + <div class="layui-input-block"> + <input disabled type="text" value="{:(isset($detail['url'])?$detail['url']:'')}" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">请求数据</label> + <div class="layui-input-block"> + <textarea disabled class="layui-textarea">{:(isset($detail['data'])?$detail['data']:'')}</textarea> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use('form', function(){}); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Login/add.html b/Application/Admin/View/Login/add.html new file mode 100644 index 0000000..b61f23f --- /dev/null +++ b/Application/Admin/View/Login/add.html @@ -0,0 +1,61 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>个人信息维护</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <div class="layui-form-item"> + <label class="layui-form-label">账号名</label> + <div class="layui-input-block"> + <input type="text" name="username" value="{$uname}" readonly class="layui-input"> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">真实姓名</label> + <div class="layui-input-block"> + <input type="text" name="nickname" value="" placeholder="请输入新的姓名,留空表示不修改" class="layui-input"> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">账号密码</label> + <div class="layui-input-block"> + <input type="password" name="password" value="" placeholder="请输入新的密码,留空表示不修改" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="admin-form">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("changeUser")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Login/index.html b/Application/Admin/View/Login/index.html new file mode 100644 index 0000000..2afd9df --- /dev/null +++ b/Application/Admin/View/Login/index.html @@ -0,0 +1,118 @@ + +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="renderer" content="webkit"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + <title>{:C('APP_NAME')}管理后台</title> + <link rel="stylesheet" type="text/css" href="__PUBLIC__/layui/css/layui.css" /> + <style> + /* login */ + .login-body { + background: url("__PUBLIC__/images/bg.png") repeat fixed; + } + .login-box { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + width: 320px; + height: 241px; + max-height: 300px; + } + .login-body .login-box h3{ + color: #444; + font-size: 22px; + text-align: center; + } + .login-box .layui-input[type='number'] { + display: inline-block; + width: 50%; + vertical-align: top; + } + .login-box img { + display: inline-block; + width: 46%; + height: 38px; + border: none; + vertical-align: top; + cursor: pointer; + margin-left: 4%; + } + .login-box button.btn-reset{ + width: 95px; + } + .login-box button.btn-submit{ + width: 190px; + } + .login-box .version{ + font-size: 12px; + } + </style> +</head> +<body class="login-body"> + +<div class="login-box"> + <form class="layui-form layui-form-pane"> + <div class="layui-form-item"> + <h3>{:C('APP_NAME')}管理后台 <span class="version">{:C('APP_VERSION')}</span></h3> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">用户名:</label> + <div class="layui-input-inline"> + <input type="text" name="username" required class="layui-input" lay-verify="username" placeholder="请输入用户名"/> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">密码:</label> + <div class="layui-input-inline"> + <input type="password" name="password" required class="layui-input" lay-verify="password" placeholder="请输入密码"/> + </div> + </div> + <div class="layui-form-item"> + <button type="reset" class="layui-btn btn-reset layui-btn-danger" >重置</button> + <button type="button" class="layui-btn btn-submit" lay-submit="" lay-filter="sub">立即登录</button> + </div> + </form> +</div> +<script type="text/javascript" src="__PUBLIC__/layui/layui.js"></script> +<script type="text/javascript"> + layui.use(['form', 'layer'], function () { + var $ = layui.jquery,form = layui.form(),layer = layui.layer; + + // 登录表单验证 + form.verify({ + username: function (value) { + if (value == "") { + return "请输入用户名"; + } + }, + password: function (value) { + if (value == "") { + return "请输入密码"; + } + } + }); + + form.on('submit(sub)', function (data) { + $.post("{:U('Login/login')}",data.field,function(res){ + if(res.code > 0){ + layer.msg(res.msg,{time:1800},function(){ + location.href = "{:U('Index/index')}"; + }); + }else{ + layer.msg(res.msg,{time:1800}); + $('#verify').click(); + } + }); + return false; + }) + }) + +</script> +</body> +</html> \ No newline at end of file diff --git a/Application/Admin/View/Menu/add.html b/Application/Admin/View/Menu/add.html new file mode 100644 index 0000000..dcea19a --- /dev/null +++ b/Application/Admin/View/Menu/add.html @@ -0,0 +1,109 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>菜单管理 - {:(isset($detail['id'])?'编辑':'新增')}菜单</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 菜单名称</label> + <div class="layui-input-block"> + <input type="text" name="name" required value="{:(isset($detail['name'])?$detail['name']:'')}" lay-verify="required" placeholder="请输入菜单名称" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 父级菜单</label> + <div class="layui-input-block"> + <select name="fid" lay-verify=""> + <option value="0">顶级菜单</option> + <volist name="options" id="vo"> + <option value="{$key}" {:($detail['fid'] == $key?'selected':'')}>{$vo}</option> + </volist> + </select> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 是否隐藏</label> + <div class="layui-input-block"> + <input type="checkbox" name="hide" lay-skin="switch" lay-text="隐藏|显示" {:((isset($detail['hide']) && $detail['hide']==1)?'checked':'')}> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">菜单URL</label> + <div class="layui-input-block"> + <input type="text" name="url" value="{:(isset($detail['url'])?$detail['url']:'')}" placeholder="请输入菜单URL" class="layui-input"> + </div> + </div> + <div class="layui-form-item layui-form-text"> + <label class="layui-form-label">菜单排序</label> + <div class="layui-input-block"> + <input type="text" name="sort" value="{:(isset($detail['sort'])?$detail['sort']:'')}" placeholder="请输入正整数,越大排名越靠后" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="admin-form">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <if condition="isset($detail['id'])"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("edit")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + <else /> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("add")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + </if> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Menu/index.html b/Application/Admin/View/Menu/index.html new file mode 100644 index 0000000..b3bda8e --- /dev/null +++ b/Application/Admin/View/Menu/index.html @@ -0,0 +1,93 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>菜单管理 - 菜单列表</legend> + <div class="layui-field-box"> + <span class="layui-btn layui-btn-normal api-add"><i class="layui-icon"></i> 新增</span> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th>菜单名称</th> + <th>排序</th> + <th>菜单URL</th> + <th>隐藏</th> + <th>操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['showName']}</td> + <td>{$vo['sort']}</td> + <td>{$vo['url']}</td> + <td> + <if condition="$vo['hide']"> + <span style="border-radius: 2px;background-color: #FF5722;padding:5px 10px;color: #ffffff">隐藏</span> + <else /> + <span style="border-radius: 2px;background-color: #5FB878;padding:5px 10px;color: #ffffff">显示</span> + </if> + </td> + <td> + <if condition="$vo['hide']"> + <span class="layui-btn confirm" data-info="你确定显示当前菜单么?" data-id="{$vo['id']}" data-url="{:U('open')}">显示</span> + <else /> + <span class="layui-btn layui-btn-danger confirm" data-info="你确定隐藏当前菜单么?" data-id="{$vo['id']}" data-url="{:U('close')}">隐藏</span> + </if> + <span data-url="{:U('edit', array('id' => $vo['id']))}" class="layui-btn edit layui-btn-normal">编辑</span> + <span class="layui-btn layui-btn-danger confirm" data-id="{$vo['id']}" data-info="你确定删除当前菜单么?" data-url="{:U('del')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.api-add').on('click', function () { + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: '{:U("add")}' + }); + }); + $('.edit').on('click', function () { + var ownObj = $(this); + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: ownObj.attr('data-url') + }); + }); + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Permission/add.html b/Application/Admin/View/Permission/add.html new file mode 100644 index 0000000..e5d5fe3 --- /dev/null +++ b/Application/Admin/View/Permission/add.html @@ -0,0 +1,86 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>权限管理 - {:(isset($detail['id'])?'编辑':'新增')}权限组</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 权限组名称</label> + <div class="layui-input-block"> + <input type="text" name="name" required value="{:(isset($detail['name'])?$detail['name']:'')}" lay-verify="required" placeholder="请输入权限组名称" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">权限组描述</label> + <div class="layui-input-block"> + <textarea name="description" placeholder="请输入权限组描述" class="layui-textarea">{:(isset($detail['description'])?$detail['description']:'')}</textarea> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="admin-form">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <if condition="isset($detail['id'])"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("edit")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + <else /> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("add")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + </if> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Permission/group.html b/Application/Admin/View/Permission/group.html new file mode 100644 index 0000000..4afb736 --- /dev/null +++ b/Application/Admin/View/Permission/group.html @@ -0,0 +1,56 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>授权管理</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <input type="hidden" name="uid" value="{:I('get.uid')}"> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 请选择组</label> + <div class="layui-input-block"> + <volist name="allGroup" id="vo"> + <if condition="in_array($vo['id'], $groupAccess)"> + <input type="checkbox" name="groupAccess[{$vo['id']}]" value="{$vo['id']}" title="{$vo['name']}" checked> + <else /> + <input type="checkbox" name="groupAccess[{$vo['id']}]" value="{$vo['id']}" title="{$vo['name']}"> + </if> + </volist> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="admin-form">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("group")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Permission/index.html b/Application/Admin/View/Permission/index.html new file mode 100644 index 0000000..4f72b5a --- /dev/null +++ b/Application/Admin/View/Permission/index.html @@ -0,0 +1,99 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>权限管理 - 权限组列表</legend> + <div class="layui-field-box"> + <span class="layui-btn layui-btn-normal api-add"><i class="layui-icon"></i> 新增</span> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th>权限组</th> + <th>描述</th> + <th>访问授权</th> + <th>成员授权</th> + <th>状态</th> + <th>操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['name']}</td> + <td>{$vo['description']}</td> + <td> + <span data-url="{:U('rule', array('group_id' => $vo['id']))}" class="layui-btn edit">访问授权</span> + </td> + <td> + <span data-url="{:U('member', array('group_id' => $vo['id']))}" class="layui-btn edit">成员授权</span> + </td> + <td> + <if condition="$vo['status']"> + <span style="border-radius: 2px;background-color: #5FB878;padding:5px 10px;color: #ffffff">启用</span> + <else /> + <span style="border-radius: 2px;background-color: #FF5722;padding:5px 10px;color: #ffffff">禁用</span> + </if> + </td> + <td> + <if condition="$vo['status']"> + <span class="layui-btn layui-btn-danger confirm" data-info="你确定禁用当前权限组么?" data-id="{$vo['id']}" data-url="{:U('close')}">禁用</span> + <else /> + <span class="layui-btn confirm" data-info="你确定启用当前权限组么?" data-id="{$vo['id']}" data-url="{:U('open')}">启用</span> + </if> + <span data-url="{:U('edit', array('id' => $vo['id']))}" class="layui-btn edit layui-btn-normal">编辑</span> + <span class="layui-btn layui-btn-danger confirm" data-id="{$vo['id']}" data-info="你确定删除当前权限组么?" data-url="{:U('del')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.api-add').on('click', function () { + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: '{:U("add")}' + }); + }); + $('.edit').on('click', function () { + var ownObj = $(this); + layer.open({ + type: 2, + area: ['80%', '66%'], + maxmin: true, + content: ownObj.attr('data-url') + }); + }); + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Permission/member.html b/Application/Admin/View/Permission/member.html new file mode 100644 index 0000000..8248621 --- /dev/null +++ b/Application/Admin/View/Permission/member.html @@ -0,0 +1,73 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>权限管理 - 权限组成员列表</legend> + <div class="layui-field-box"> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th>用户账号</th> + <th>用户昵称</th> + <th>登录次数</th> + <th>最后登录时间</th> + <th>最后登录IP</th> + <th>状态</th> + <th>操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['username']}</td> + <td>{$vo['nickname']}</td> + <td>{:intval($vo['loginTimes'])}</td> + <td>{:(empty($vo['lastLoginTime'])?'该用户未曾登录过':date('Y-m-d H:i:s', $vo['lastLoginTime']))}</td> + <td>{:(empty($vo['lastLoginIp'])?'该用户未曾登录过':long2ip($vo['lastLoginIp']))}</td> + <td> + <if condition="$vo['status']"> + <span style="border-radius: 2px;background-color: #5FB878;padding:5px 10px;color: #ffffff">启用</span> + <else /> + <span style="border-radius: 2px;background-color: #FF5722;padding:5px 10px;color: #ffffff">禁用</span> + </if> + </td> + <td> + <span class="layui-btn layui-btn-danger confirm" data-uid="{$vo['uid']}" data-info="你确定踢出当前用户么?" data-url="{:U('delMember')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {uid:ownObj.attr('data-uid'),groupId:{:I("get.group_id")}}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Permission/rule.html b/Application/Admin/View/Permission/rule.html new file mode 100644 index 0000000..abc9526 --- /dev/null +++ b/Application/Admin/View/Permission/rule.html @@ -0,0 +1,74 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>权限管理 - 权限组细节配置</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <input type="hidden" name="groupId" value="{:I('get.group_id')}"> + <volist name="list" id="vo"> + <div class="layui-form-item"> + <input lay-skin="primary" type="checkbox" lay-filter="admin-check" name="rule[{$vo['id']}]" value="{$vo['url']}" title="{$vo['name']}" {:(in_array($vo['url'], $hasRule)?'checked':'')}> + </div> + <if condition="count($vo['_child'])"> + <div class="layui-form-item"> + <div style="margin-left: 50px;"> + <volist name="vo['_child']" id="child"> + <input lay-skin="primary" type="checkbox" lay-filter="admin-check" fid="{$vo['url']}" name="rule[{$child['id']}]" value="{$child['url']}" title="{$child['name']}" {:(in_array($child['url'], $hasRule)?'checked':'')}> + <if condition="count($child['_child'])"> + <div style="margin-left: 50px;"> + <volist name="child['_child']" id="_child"> + <input lay-skin="primary" type="checkbox" pid="{$vo['url']}" fid="{$child['url']}" name="rule[{$_child['id']}]" value="{$_child['url']}" title="{$_child['name']}" {:(in_array($_child['url'], $hasRule)?'checked':'')}> + </volist> + </div> + </if> + </volist> + </div> + </div> + </if> + </volist> + <div class="layui-form-item"> + <button class="layui-btn" lay-submit lay-filter="admin-form">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('checkbox(admin-check)', function(data){ + var $el = data.elem; + if( $el.checked ){ + $('input[fid="'+data.elem.value+'"]').attr('checked','checked'); + $('input[pid="'+data.elem.value+'"]').attr('checked','checked'); + form.render(); + }else{ + $('input[fid="'+data.elem.value+'"]').removeAttr('checked'); + $('input[pid="'+data.elem.value+'"]').removeAttr('checked'); + form.render(); + } + }); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("rule")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/View/Public/base.html b/Application/Admin/View/Public/base.html new file mode 100644 index 0000000..703256c --- /dev/null +++ b/Application/Admin/View/Public/base.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> + <title>{:C('APP_NAME')}管理后台</title> + <link rel="stylesheet" href="__PUBLIC__/layui/css/layui.css"> + <script type="text/javascript" src="__PUBLIC__/layui/layui.js"></script> + <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> + <block name="myCss"></block> +</head> +<body> +<div style="margin: 15px;"> + <block name="main"></block> +</div> +<block name="myScript"></block> +</body> +</html> \ 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..c5b3f83 --- /dev/null +++ b/Application/Admin/View/User/add.html @@ -0,0 +1,95 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>用户管理 - {:(isset($detail['id'])?'编辑':'新增')}用户</legend> + <div class="layui-field-box"> + <form class="layui-form" action=""> + <if condition="isset($detail['id'])"> + <input type="hidden" name="id" value="{$detail['id']}"> + </if> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 账号名</label> + <div class="layui-input-block"> + <input type="text" name="username" required value="{:(isset($detail['username'])?$detail['username']:'')}" lay-verify="required" placeholder="请输入账号名" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 真实姓名</label> + <div class="layui-input-block"> + <input type="text" name="nickname" required value="{:(isset($detail['nickname'])?$detail['nickname']:'')}" lay-verify="required" placeholder="请输入真实姓名" class="layui-input"> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label"><span style="color:red">*</span> 用户密码</label> + <div class="layui-input-inline"> + <input type="password" name="password" required lay-verify="required" value="{:(isset($detail['password'])?'':'123456')}" placeholder="请输入密码" class="layui-input"> + </div> + <div class="layui-form-mid layui-word-aux">默认:123456</div> + <div class="layui-input-block"> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <button class="layui-btn" lay-submit lay-filter="admin-form">立即提交</button> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + </div> + </form> + </div> + </fieldset> +</block> +<block name="myScript"> + <if condition="isset($detail['id'])"> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("edit")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + <else /> + <script> + layui.use('form', function(){ + var form = layui.form(); + form.on('submit(admin-form)', function(data){ + $.ajax({ + type: "POST", + url: '{:U("add")}', + data: data.field, + success: function(msg){ + if( msg.code == 1 ){ + parent.location.reload(); + }else{ + parent.layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + return false; + }); + + }); + </script> + </if> +</block> \ 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..7c8f9c9 --- /dev/null +++ b/Application/Admin/View/User/index.html @@ -0,0 +1,97 @@ +<extend name="Public/base" /> +<block name="main"> + <fieldset class="layui-elem-field"> + <legend>用户管理 - 用户列表</legend> + <div class="layui-field-box"> + <span class="layui-btn layui-btn-normal api-add"><i class="layui-icon"></i> 新增</span> + <table class="layui-table" lay-even> + <thead> + <tr> + <th>#</th> + <th>用户账号</th> + <th>用户昵称</th> + <th>登录次数</th> + <th>最后登录时间</th> + <th>最后登录IP</th> + <th>状态</th> + <th>操作</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td>{$vo['username']}</td> + <td>{$vo['nickname']}</td> + <td>{:intval($vo['loginTimes'])}</td> + <td>{:(empty($vo['lastLoginTime'])?'该用户未曾登录过':$vo['lastLoginTime'])}</td> + <td>{:(empty($vo['lastLoginIp'])?'该用户未曾登录过':$vo['lastLoginIp'])}</td> + <td> + <if condition="$vo['status']"> + <span style="border-radius: 2px;background-color: #5FB878;padding:5px 10px;color: #ffffff">启用</span> + <else /> + <span style="border-radius: 2px;background-color: #FF5722;padding:5px 10px;color: #ffffff">禁用</span> + </if> + </td> + <td> + <if condition="$vo['status']"> + <span class="layui-btn layui-btn-danger confirm" data-info="你确定禁用当前用户么?" data-id="{$vo['id']}" data-url="{:U('close')}">禁用</span> + <else /> + <span class="layui-btn confirm" data-info="你确定启用当前用户么?" data-id="{$vo['id']}" data-url="{:U('open')}">启用</span> + </if> + <span data-url="{:U('Permission/group', array('uid' => $vo['id']))}" class="layui-btn edit layui-btn-normal">授权</span> + <span class="layui-btn layui-btn-danger confirm" data-id="{$vo['id']}" data-info="你确定删除当前菜单么?" data-url="{:U('del')}">删除</span> + </td> + </tr> + </volist> + </tbody> + </table> + </div> + </fieldset> +</block> +<block name="myScript"> + <script> + layui.use(['layer'], function() { + $('.api-add').on('click', function () { + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: '{:U("add")}' + }); + }); + $('.edit').on('click', function () { + var ownObj = $(this); + layer.open({ + type: 2, + area: ['60%', '60%'], + maxmin: true, + content: ownObj.attr('data-url') + }); + }); + $('.confirm').on('click', function () { + var ownObj = $(this); + layer.confirm(ownObj.attr('data-info'), { + btn: ['确定','取消'] //按钮 + }, function(){ + $.ajax({ + type: "POST", + url: ownObj.attr('data-url'), + data: {id:ownObj.attr('data-id')}, + success: function(msg){ + if( msg.code == 1 ){ + location.reload(); + }else{ + layer.msg(msg.msg, { + icon: 5, + shade: [0.6, '#393D49'], + time:1500 + }); + } + } + }); + }); + }); + }); + </script> +</block> \ No newline at end of file diff --git a/Application/Admin/index.html b/Application/Admin/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Admin/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/application/extra/index.html b/Application/ApiLog/index.html similarity index 100% rename from application/extra/index.html rename to Application/ApiLog/index.html diff --git a/Application/Common/Common/function.php b/Application/Common/Common/function.php new file mode 100644 index 0000000..ea9ad97 --- /dev/null +++ b/Application/Common/Common/function.php @@ -0,0 +1,52 @@ +<?php + +/** + * 获取HTTP全部头信息 + */ +if (!function_exists('apache_request_headers')) { + function apache_request_headers(){ + $arh = array(); + $rx_http = '/\AHTTP_/'; + foreach ($_SERVER as $key => $val) { + if (preg_match($rx_http, $key)) { + $arh_key = preg_replace($rx_http, '', $key); + $rx_matches = explode('_', $arh_key); + if (count($rx_matches) > 0 and strlen($arh_key) > 2) { + foreach ($rx_matches as $ak_key => $ak_val) + $rx_matches[$ak_key] = ucfirst($ak_val); + $arh_key = implode('-', $rx_matches); + } + $arh[$arh_key] = $val; + } + } + + return $arh; + } +} + +/** + * @param $url + * @param int $timeOut + * @return bool|mixed + */ +if (!function_exists('curlGet')) { + function curlGet($url, $timeOut = 10){ + $oCurl = curl_init(); + if (stripos($url, "https://") !== false) { + curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); + } + curl_setopt($oCurl, CURLOPT_URL, $url); + curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($oCurl, CURLOPT_TIMEOUT, $timeOut); + $sContent = curl_exec($oCurl); + $aStatus = curl_getinfo($oCurl); + curl_close($oCurl); + if (intval($aStatus["http_code"]) == 200) { + return $sContent; + } else { + return false; + } + } +} \ No newline at end of file diff --git a/Application/Common/Common/index.html b/Application/Common/Common/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Common/Common/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Common/Conf/config.php b/Application/Common/Conf/config.php new file mode 100644 index 0000000..88b38dc --- /dev/null +++ b/Application/Common/Conf/config.php @@ -0,0 +1,35 @@ +<?php + +return array( + 'URL_MODEL' => 2, + + 'APP_VERSION' => 'v1.0', + 'APP_NAME' => 'apiAdmin', + + 'USER_ADMINISTRATOR' => array(1,2), + 'AUTH_KEY' => 'I&TC{pft>L,C`wFQ>&#ROW>k{Kxlt1>ryW(>r<#R', + + 'COMPANY_NAME' => 'ApiAdmin开发维护团队', + + 'URL_ROUTER_ON' => true, + 'URL_ROUTE_RULES' => array( + 'wiki/:hash' => 'Home/Wiki/apiField', + 'api/:hash' => 'Home/Api/index', + 'wikiList' => 'Home/Wiki/apiList', + 'errorList' => 'Home/Wiki/errorCode', + 'calculation' => 'Home/Wiki/calculation' + ), + + 'LANG_SWITCH_ON' => true, // 开启语言包功能 + 'LANG_LIST' => 'zh-cn', // 允许切换的语言列表 用逗号分隔 + 'VAR_LANGUAGE' => 'l', // 默认语言切换变量 + + /* 数据库设置 */ + 'DB_TYPE' => 'mysql', // 数据库类型 + 'DB_HOST' => '127.0.0.1', // 服务器地址 + 'DB_NAME' => 'demo', // 数据库名 + 'DB_USER' => 'root', // 用户名 + 'DB_PWD' => '123456' // 密码 + +); + diff --git a/Application/Common/Conf/index.html b/Application/Common/Conf/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Common/Conf/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Common/index.html b/Application/Common/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Common/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Data/apiAdmin.sql b/Application/Data/apiAdmin.sql new file mode 100644 index 0000000..87e95b8 --- /dev/null +++ b/Application/Data/apiAdmin.sql @@ -0,0 +1,273 @@ +# ************************************************************ +# Sequel Pro SQL dump +# Version 4541 +# +# http://www.sequelpro.com/ +# https://github.com/sequelpro/sequelpro +# +# Host: 192.168.105.105 (MySQL 5.5.40-log) +# Database: rent +# Generation Time: 2017-04-15 12:45:48 +0000 +# ************************************************************ + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + + +# Dump of table api_app +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_app`; + +CREATE TABLE `api_app` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `app_id` varchar(50) NOT NULL DEFAULT '' COMMENT '应用id', + `app_secret` varchar(50) NOT NULL DEFAULT '' COMMENT '应用密码', + `app_name` varchar(50) NOT NULL DEFAULT '' COMMENT '应用名称', + `app_status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '应用状态:0表示禁用,1表示启用', + `app_info` tinytext NOT NULL COMMENT '应用说明', + PRIMARY KEY (`id`), + UNIQUE KEY `app_id` (`app_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='appId和appSecret表'; + + +# Dump of table api_auth_group +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_auth_group`; + +CREATE TABLE `api_auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL COMMENT '组名称', + `description` varchar(50) NOT NULL COMMENT '组描述', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '组状态:为1正常,为0禁用', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限组'; + + +# Dump of table api_auth_group_access +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_auth_group_access`; + +CREATE TABLE `api_auth_group_access` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `uid` mediumint(8) unsigned NOT NULL, + `groupId` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `uid` (`uid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户和组的对应关系'; + + +# Dump of table api_auth_rule +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_auth_rule`; + +CREATE TABLE `api_auth_rule` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `url` char(80) NOT NULL DEFAULT '' COMMENT '规则唯一标识', + `groupId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '权限所属组的ID', + `auth` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '权限数值', + `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态:为1正常,为0禁用', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限细节'; + + +# Dump of table api_fields +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_fields`; + +CREATE TABLE `api_fields` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `fieldName` varchar(50) NOT NULL DEFAULT '' COMMENT '字段名称', + `hash` varchar(50) NOT NULL DEFAULT '' COMMENT '对应接口的唯一标识', + `dataType` tinyint(2) NOT NULL DEFAULT '0' COMMENT '数据类型,来源于DataType类库', + `default` varchar(500) NOT NULL DEFAULT '' COMMENT '默认值', + `isMust` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否必须 0为不必须,1为必须', + `range` varchar(500) NOT NULL DEFAULT '' COMMENT '范围,Json字符串,根据数据类型有不一样的含义', + `info` varchar(500) NOT NULL DEFAULT '' COMMENT '字段说明', + `type` tinyint(2) NOT NULL DEFAULT '0' COMMENT '字段用处:0为request,1为response', + `showName` varchar(50) NOT NULL DEFAULT '' COMMENT 'wiki显示用字段', + PRIMARY KEY (`id`), + KEY `hash` (`hash`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于保存各个API的字段规则'; + + +# Dump of table api_fields_info +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_fields_info`; + +CREATE TABLE `api_fields_info` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一主键', + `field` varchar(50) NOT NULL DEFAULT '' COMMENT '字段名', + `info` varchar(300) NOT NULL DEFAULT '' COMMENT '字段说明', + PRIMARY KEY (`id`), + UNIQUE KEY `field` (`field`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='字段说明对应关系'; + + +# Dump of table api_list +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_list`; + +CREATE TABLE `api_list` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `apiName` varchar(50) NOT NULL DEFAULT '' COMMENT 'api索引,保存了类和方法', + `hash` varchar(50) NOT NULL DEFAULT '' COMMENT 'api唯一标识', + `accessToken` tinyint(2) NOT NULL DEFAULT '1' COMMENT '是否需要认证AccessToken 1:需要,0:不需要', + `needLogin` tinyint(2) NOT NULL DEFAULT '1' COMMENT '是否需要认证用户token 1:需要 0:不需要', + `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT 'API状态:0表示禁用,1表示启用', + `method` tinyint(2) NOT NULL DEFAULT '2' COMMENT '请求方式0:不限1:Post,2:Get', + `info` varchar(500) NOT NULL DEFAULT '' COMMENT 'api中文说明', + `isTest` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否是测试模式:0:生产模式,1:测试模式', + `returnStr` text COMMENT '返回数据示例', + PRIMARY KEY (`id`), + UNIQUE KEY `hash` (`hash`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于维护接口信息'; + + +# Dump of table api_menu +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_menu`; + +CREATE TABLE `api_menu` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单名', + `fid` int(11) NOT NULL COMMENT '父级菜单ID', + `url` varchar(50) NOT NULL DEFAULT '' COMMENT '链接', + `auth` tinyint(2) NOT NULL DEFAULT '0' COMMENT '访客权限', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `hide` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否显示', + `icon` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单图标', + `level` tinyint(2) NOT NULL DEFAULT '0' COMMENT '菜单认证等级', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='目录信息'; + +LOCK TABLES `api_menu` WRITE; +/*!40000 ALTER TABLE `api_menu` DISABLE KEYS */; + +INSERT INTO `api_menu` (`id`, `name`, `fid`, `url`, `auth`, `sort`, `hide`, `icon`, `level`) +VALUES + (1,'欢迎页',0,'Index/welcome',0,0,0,'',0), + (2,'系统配置',0,'',0,1,0,'',0), + (3,'菜单维护',2,'Menu/index',0,0,0,'',0), + (4,'用户管理',2,'User/index',0,1,0,'',0), + (5,'权限管理',2,'Permission/index',0,2,0,'',0), + (6,'操作日志',2,'Log/index',0,3,0,'',0), + (7,'应用管理',0,'',0,2,0,'',0), + (8,'应用列表',7,'App/index',0,0,0,'',0), + (9,'接口列表',7,'ApiManage/index',0,1,0,'',0), + (10,'字段注解',7,'FieldsInfoManage/index',0,2,1,'',0), + (11,'首页',0,'Index/index',0,0,1,'',0), + (12,'新增菜单',3,'Menu/add',0,0,1,'',0), + (13,'编辑菜单',3,'Menu/edit',0,0,1,'',0), + (14,'隐藏菜单',3,'Menu/close',0,0,1,'',0), + (15,'显示菜单',3,'Menu/open',0,0,1,'',0), + (16,'删除菜单',3,'Menu/del',0,0,1,'',0), + (17,'新增用户',4,'User/add',0,0,1,'',0), + (18,'账号封停',4,'User/close',0,0,1,'',0), + (19,'账号解封',4,'User/open',0,0,1,'',0), + (20,'账号删除',4,'User/del',0,0,1,'',0), + (21,'编辑应用',8,'App/edit',0,0,1,'',0), + (22,'新增应用',8,'App/add',0,0,1,'',0), + (23,'启用应用',8,'App/open',0,0,1,'',0), + (24,'禁用应用',8,'App/close',0,0,1,'',0), + (25,'删除应用',8,'App/del',0,0,1,'',0), + (26,'新增接口',9,'ApiManage/add',0,0,1,'',0), + (27,'启用接口',9,'ApiManage/open',0,0,1,'',0), + (28,'禁用接口',9,'ApiManage/close',0,0,1,'',0), + (29,'编辑接口',9,'ApiManage/edit',0,0,1,'',0), + (30,'删除接口',9,'ApiManage/del',0,0,1,'',0), + (31,'返回字段编辑',9,'FieldsManage/response',0,0,1,'',0), + (32,'请求字段编辑',9,'FieldsManage/request',0,0,1,'',0), + (33,'新增字段',9,'FieldsManage/add',0,0,1,'',0), + (34,'字段编辑',9,'FieldsManage/edit',0,0,1,'',0), + (35,'批量上传返回字段',9,'FieldsManage/upload',0,0,1,'',0), + (36,'Ajax查询Log列表',6,'Log/ajaxGetIndex',0,0,1,'',0), + (37,'日志删除',6,'Log/del',0,0,1,'',0), + (38,'日志详情查看',6,'Log/showDetail',0,0,1,'',0), + (39,'添加权限组',5,'Permission/add',0,0,1,'',0), + (40,'禁用权限组',5,'Permission/close',0,0,1,'',0), + (41,'启用权限组',5,'Permission/open',0,0,1,'',0), + (42,'编辑权限组',5,'Permission/edit',0,0,1,'',0), + (43,'删除权限组',5,'Permission/del',0,0,1,'',0), + (44,'用户入组',5,'Permission/group',0,0,1,'',0), + (45,'组用户列表',5,'Permission/member',0,0,1,'',0), + (46,'踢出成员',5,'Permission/delMember',0,0,1,'',0), + (47,'权限组权限配置',5,'Permission/rule',0,0,1,'',0); + +/*!40000 ALTER TABLE `api_menu` ENABLE KEYS */; +UNLOCK TABLES; + + +# Dump of table api_user +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_user`; + +CREATE TABLE `api_user` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', + `nickname` varchar(64) NOT NULL DEFAULT '' COMMENT '用户昵称', + `password` char(32) NOT NULL DEFAULT '' COMMENT '用户密码', + `regTime` int(10) NOT NULL DEFAULT '0' COMMENT '注册时间', + `regIp` varchar(11) NOT NULL DEFAULT '' COMMENT '注册IP', + `updateTime` int(10) NOT NULL DEFAULT '0' COMMENT '更新时间', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '账号状态 0封号 1正常', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员认证信息'; +INSERT INTO `api_user` (`username`, `nickname`, `password`, `regTime`, `regIp`, `updateTime`, `status`) +VALUES + ('root', 'root', '912601e4ad1b308c9ae41877cf6ca754', 1492004246, '3682992231', 1492236545, 1); + + + +# Dump of table api_user_action +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_user_action`; + +CREATE TABLE `api_user_action` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `actionName` varchar(50) NOT NULL DEFAULT '' COMMENT '行为名称', + `uid` int(11) NOT NULL DEFAULT '0' COMMENT '操作用户ID', + `nickname` varchar(50) NOT NULL DEFAULT '' COMMENT '用户昵称', + `addTime` int(11) NOT NULL DEFAULT '0' COMMENT '操作时间', + `data` text COMMENT '用户提交的数据', + `url` varchar(200) NOT NULL DEFAULT '' COMMENT '操作URL', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户操作日志'; + + +# Dump of table api_user_data +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `api_user_data`; + +CREATE TABLE `api_user_data` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `loginTimes` int(11) NOT NULL COMMENT '账号登录次数', + `lastLoginIp` varchar(11) NOT NULL DEFAULT '' COMMENT '最后登录IP', + `lastLoginTime` int(11) NOT NULL COMMENT '最后登录时间', + `uid` varchar(11) NOT NULL DEFAULT '' COMMENT '用户ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员数据表'; + + +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_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 */; diff --git a/Application/Home/Api/Base.class.php b/Application/Home/Api/Base.class.php new file mode 100644 index 0000000..542b75a --- /dev/null +++ b/Application/Home/Api/Base.class.php @@ -0,0 +1,20 @@ +<?php +/** + * + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\Api; + + +class Base { + + protected $city; + protected $userInfo; + + public function __construct() { + $this->city = C('CITY'); + $this->userInfo = C('USER_INFO'); + } +} \ No newline at end of file diff --git a/Application/Home/Api/BuildToken.class.php b/Application/Home/Api/BuildToken.class.php new file mode 100644 index 0000000..a225b1d --- /dev/null +++ b/Application/Home/Api/BuildToken.class.php @@ -0,0 +1,53 @@ +<?php + +/** + * 和Token相关的全部接口 + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\Api; + +use Admin\Model\ApiAppModel; +use Home\ORG\ApiLog; +use Home\ORG\Crypt; +use Home\ORG\Response; +use Home\ORG\ReturnCode; + +class BuildToken extends Base { + + public function getAccessToken($param) { + if (empty($param['app_id'])) { + Response::error(ReturnCode::EMPTY_PARAMS, '缺少app_id'); + } + $appObj = new ApiAppModel(); + $appInfo = $appObj->where(array('app_id' => $param['app_id'], 'app_status' => 1))->find(); + if (empty($appInfo)) { + Response::error(ReturnCode::INVALID, '应用ID非法'); + } + $crypt = new Crypt(); + $signature = $param['signature']; + unset($param['signature']); + $sign = $crypt->getAuthToken($appInfo['app_secret'], $param); + Response::debug($sign); + if ($sign !== $signature) { + Response::error(ReturnCode::INVALID, '身份令牌验证失败'); + } + $expires = C('ACCESS_TOKEN_EXPIRES'); + $accessToken = S($param['device_id']); + if ($accessToken) { + S($accessToken, null); + S($param['device_id'], null); + } + $accessToken = $crypt->getAccessToken($appInfo['app_id'], $appInfo['app_secret']); + $appInfo['device_id'] = $param['device_id']; + ApiLog::setAppInfo($appInfo); + S($accessToken, $appInfo, $expires); + S($param['device_id'], $accessToken, $expires); + $return['access_token'] = $accessToken; + $return['expires_in'] = $expires; + + return $return; + } + +} \ No newline at end of file diff --git a/Application/Home/Api/Test.class.php b/Application/Home/Api/Test.class.php new file mode 100644 index 0000000..c7dabce --- /dev/null +++ b/Application/Home/Api/Test.class.php @@ -0,0 +1,19 @@ +<?php + +/** + * + * @since 2017/03/10 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\Api; + +use Home\ORG\JPush; + +class Test extends Base { + + public function index() { + + } + +} \ No newline at end of file diff --git a/Application/Home/Common/index.html b/Application/Home/Common/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Home/Common/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Home/Conf/config.php b/Application/Home/Conf/config.php new file mode 100644 index 0000000..cb6d64a --- /dev/null +++ b/Application/Home/Conf/config.php @@ -0,0 +1,14 @@ +<?php + +return array( + + //默认每页显示数量 + 'DEFAULT_PER_PAGE' => 10, + + //AccessToken有效期(单位:秒) + 'ACCESS_TOKEN_EXPIRES' => 7200, + + //UserToken有效期(单位:秒) + 'USER_TOKEN_EXPIRES' => null, + +); \ No newline at end of file diff --git a/Application/Home/Conf/index.html b/Application/Home/Conf/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Home/Conf/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Home/Controller/ApiController.class.php b/Application/Home/Controller/ApiController.class.php new file mode 100644 index 0000000..31f6f94 --- /dev/null +++ b/Application/Home/Controller/ApiController.class.php @@ -0,0 +1,151 @@ +<?php +/** + * Api入口 + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\Controller; + + +use Home\ORG\ApiLog; +use Home\ORG\Filter; +use Home\ORG\Response; +use Home\ORG\ReturnCode; +use Think\Log; + +class ApiController extends BaseController { + + private $apiDetail; //api配置(API路由,是否需要登录,是否需要AccessToken) + private $apiRequest; //请求参数规则 + private $apiResponse; //返回参数规则 + private $param; //根据API配置过滤后的传入参数 + private $header; //http request header信息 + + + public function index() { + $getArr = I('get.'); + $postArr = I('post.'); + $this->apiDetail = M('ApiList')->where(array('hash' => $getArr['hash'], 'status' => 1))->find(); + + if (empty($this->apiDetail)) { + Response::error(ReturnCode::NOT_EXISTS, '非法的API标识'); + } + ApiLog::setApiInfo($this->apiDetail); + + $this->apiRequest = M('ApiFields')->where(array('hash' => $getArr['hash'], 'type' => 0))->select(); + $this->apiResponse = M('ApiFields')->where(array('hash' => $getArr['hash'], 'type' => 1))->select(); + $returnType = M('ApiFields')->where(array('hash' => $getArr['hash'], 'showName' => 'data', 'type' => 1))->find(); + Response::setDataType($returnType['dataType']); + + $this->header = apache_request_headers(); + $this->header = array_change_key_case($this->header, CASE_UPPER); + ApiLog::setHeader($this->header); + + if ($this->apiDetail['accessToken'] && !$this->apiDetail['isTest']) { + $this->checkAccessToken(); + } + if (!$this->apiDetail['isTest']) { + $this->checkVersion(); + } + $this->checkLogin(); + + unset($getArr['hash']); + switch ($this->apiDetail['method']) { + case 0: + $this->param = array_merge($getArr, $postArr); + break; + case 1: + $this->param = $postArr; + break; + case 2: + $this->param = $getArr; + break; + } + ApiLog::setRequest($this->param); + $this->iniApi(); + } + + /** + * 系统初始化函数(登陆状态检测,权限检测,初始化菜单) + */ + private function iniApi() { + $filterObj = new Filter(); + if (!$this->apiDetail['isTest']) { + $this->checkRule(); + $filterObj->request($this->param, $this->apiRequest); + } + + ApiLog::setRequestAfterFilter($this->param); + list($className, $actionName) = explode('/', $this->apiDetail['apiName']); + + $moduleName = MODULE_NAME . '\\Api\\' . $className; + $reflection = new \ReflectionClass($moduleName); + if (!$reflection->hasMethod($actionName)) { + Response::error(ReturnCode::EXCEPTION, '服务器端配置异常'); + } + $method = $reflection->getMethod($actionName); + $handle = $reflection->newInstance(); + $data = $method->invokeArgs($handle, array($this->param)); + if (!$this->apiDetail['isTest']) { + $data = $filterObj->response($data, $this->apiResponse); + } + Response::success($data); + } + + /** + * Api接口合法性检测 + */ + private function checkAccessToken() { + $access_token = $this->header['ACCESS-TOKEN']; + if (!isset($access_token) || !$access_token) { + Response::error(ReturnCode::ACCESS_TOKEN_TIMEOUT, '缺少参数access-token'); + } else { + $appInfo = S($access_token); + if (!$appInfo) { + Response::error(ReturnCode::ACCESS_TOKEN_TIMEOUT, 'access-token已过期'); + } + ApiLog::setAppInfo($appInfo); + } + } + + /** + * Api版本参数校验 + */ + private function checkVersion() { + $version = $this->header['VERSION']; + if (!isset($version) || !$version) { + Response::error(ReturnCode::EMPTY_PARAMS, '缺少参数version'); + } else { + if ($version != C('APP_VERSION')) { + Response::error(ReturnCode::VERSION_INVALID, 'API版本不匹配'); + } + } + } + + /** + * 检测用户登录情况 检测通过请赋予USER_INFO值 + */ + private function checkLogin() { + if ($this->apiDetail['needLogin']) { + if (!isset($this->header['USER-TOKEN']) || !$this->header['USER-TOKEN']) { + Response::error(ReturnCode::AUTH_ERROR, '缺少user-token'); + } + } + if (isset($this->header['USER-TOKEN']) && $this->header['USER-TOKEN']) { + $userInfo = S($this->header['USER-TOKEN']); + if (!is_array($userInfo) || !isset($userInfo['passport_uid'])) { + Response::error(ReturnCode::AUTH_ERROR, 'user-token不匹配'); + } + C('USER_INFO', $userInfo); + } + } + + /** + * 权限检测&权限验证(暂时预留) + */ + private function checkRule() { + + } + +} \ No newline at end of file diff --git a/Application/Home/Controller/BaseController.class.php b/Application/Home/Controller/BaseController.class.php new file mode 100644 index 0000000..ef2f4fe --- /dev/null +++ b/Application/Home/Controller/BaseController.class.php @@ -0,0 +1,14 @@ +<?php +/** + * 工程基类 + * @since 2017/02/28 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\Controller; + + +use Think\Controller; + +class BaseController extends Controller { +} \ No newline at end of file diff --git a/Application/Home/Controller/IndexController.class.php b/Application/Home/Controller/IndexController.class.php new file mode 100644 index 0000000..36eb889 --- /dev/null +++ b/Application/Home/Controller/IndexController.class.php @@ -0,0 +1,10 @@ +<?php +namespace Home\Controller; + +use Think\Controller; + +class IndexController extends Controller { + public function index(){ + echo 'welcome'; + } +} \ No newline at end of file diff --git a/Application/Home/Controller/WikiController.class.php b/Application/Home/Controller/WikiController.class.php new file mode 100644 index 0000000..cfaaee9 --- /dev/null +++ b/Application/Home/Controller/WikiController.class.php @@ -0,0 +1,86 @@ +<?php +/** + * 文档自动生成 + * @since 2017/03/01 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\Controller; + + +use Home\ORG\DataType; +use Home\ORG\ReturnCode; +use Think\Controller; + +class WikiController extends Controller { + + public function apiList(){ + $listData = M('ApiList')->select(); + $this->assign('list', $listData); + $this->display(); + } + + public function apiField(){ + $hash = I('get.hash'); + if( empty($hash) ){ + $this->redirect('apiList'); + }else{ + $request = M('ApiFields')->where(array('hash' => $hash, 'type' => 0))->select(); + $response = M('ApiFields')->where(array('hash' => $hash, 'type' => 1))->select(); + $apiInfo = M('ApiList')->where(array('hash' => $hash))->find(); + $this->assign('apiInfo', $apiInfo); + $dataType = array( + DataType::TYPE_INTEGER => 'Integer', + DataType::TYPE_STRING => 'String', + DataType::TYPE_BOOLEAN => 'Boolean', + DataType::TYPE_ENUM => 'Enum', + DataType::TYPE_FLOAT => 'Float', + DataType::TYPE_FILE => 'File', + DataType::TYPE_ARRAY => 'Array', + DataType::TYPE_OBJECT => 'Object', + DataType::TYPE_MOBILE => 'Mobile' + ); + $this->assign('dataType', $dataType); + $this->assign('request', $request); + $this->assign('response', $response); + $this->display(); + } + } + + public function errorCode(){ + $codeArr = ReturnCode::getConstants(); + $errorInfo = array( + ReturnCode::SUCCESS => '请求成功', + ReturnCode::INVALID => '非法操作', + ReturnCode::DB_SAVE_ERROR => '数据存储失败', + ReturnCode::DB_READ_ERROR => '数据读取失败', + ReturnCode::CACHE_SAVE_ERROR => '缓存存储失败', + ReturnCode::CACHE_READ_ERROR => '缓存读取失败', + ReturnCode::FILE_SAVE_ERROR => '文件读取失败', + ReturnCode::LOGIN_ERROR => '登录失败', + ReturnCode::NOT_EXISTS => '不存在', + ReturnCode::JSON_PARSE_FAIL => 'JSON数据格式错误', + ReturnCode::TYPE_ERROR => '类型错误', + ReturnCode::NUMBER_MATCH_ERROR => '数字匹配失败', + ReturnCode::EMPTY_PARAMS => '丢失必要数据', + ReturnCode::DATA_EXISTS => '数据已经存在', + ReturnCode::AUTH_ERROR => '权限认证失败', + ReturnCode::OTHER_LOGIN => '别的终端登录', + ReturnCode::VERSION_INVALID => 'API版本非法', + ReturnCode::PARAM_INVALID => '数据类型非法', + ReturnCode::ACCESS_TOKEN_TIMEOUT => '身份令牌过期', + ReturnCode::SESSION_TIMEOUT => 'SESSION过期', + ReturnCode::UNKNOWN => '未知错误', + ReturnCode::EXCEPTION => '系统异常', + ReturnCode::CURL_ERROR => 'CURL操作异常' + ); + $this->assign('errorInfo', $errorInfo); + $this->assign('codeArr', $codeArr); + $this->display(); + } + + public function calculation(){ + $this->display(); + } + +} \ No newline at end of file diff --git a/Application/Home/Controller/index.html b/Application/Home/Controller/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Home/Controller/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Home/Model/BaseModel.class.php b/Application/Home/Model/BaseModel.class.php new file mode 100644 index 0000000..50c23ef --- /dev/null +++ b/Application/Home/Model/BaseModel.class.php @@ -0,0 +1,15 @@ +<?php +/** + * + * @since 2017/03/10 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\Model; + + +use Think\Model; + +class BaseModel extends Model { + +} \ No newline at end of file diff --git a/Application/Home/Model/index.html b/Application/Home/Model/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Home/Model/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Home/ORG/ApiLog.class.php b/Application/Home/ORG/ApiLog.class.php new file mode 100644 index 0000000..2bbca22 --- /dev/null +++ b/Application/Home/ORG/ApiLog.class.php @@ -0,0 +1,61 @@ +<?php +/** + * @since 2017-04-14 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG; + + +class ApiLog { + + private static $appInfo = null; + private static $apiInfo = null; + private static $request = null; + private static $requestAfterFilter = null; + private static $response = null; + private static $header = null; + + public static function setAppInfo($data) { + self::$appInfo = $data['app_id'] . "({$data['app_name']}) {$data['device_id']}"; + } + + public static function setHeader($data) { + $userToken = (isset($data['USER-TOKEN']) && !empty($data['USER-TOKEN']))?$data['USER-TOKEN']:'null'; + $accessToken = (isset($data['ACCESS-TOKEN']) && !empty($data['ACCESS-TOKEN']))?$data['ACCESS-TOKEN']:'null'; + self::$header = $accessToken.' '.$userToken.' '.$data['VERSION']; + } + + public static function setApiInfo($data) { + self::$apiInfo = $data['apiName'] . ' ' . $data['hash']; + } + + public static function setRequest($data) { + if (is_array($data)) { + $data = json_encode($data); + } + self::$request = $data; + } + + public static function setRequestAfterFilter($data) { + if (is_array($data)) { + $data = json_encode($data); + } + self::$requestAfterFilter = $data; + } + + public static function setResponse($data) { + if (is_array($data)) { + $data = json_encode($data); + } + self::$response = $data; + } + + public static function save() { + $logPath = APP_PATH . '/ApiLog/' . date('YmdH') . '.log'; + $logStr = self::$apiInfo . ' ' . date('H:i:s') . ' ' . self::$request . ' ' . self::$header . ' ' + . self::$response . ' ' . self::$requestAfterFilter . ' ' . self::$appInfo."\n"; + @file_put_contents($logPath, $logStr, FILE_APPEND); + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/Crypt.class.php b/Application/Home/ORG/Crypt.class.php new file mode 100644 index 0000000..adac284 --- /dev/null +++ b/Application/Home/ORG/Crypt.class.php @@ -0,0 +1,41 @@ +<?php +/** + * Api身份秘钥计算 + * @since 2017/02/28 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG; + + +class Crypt { + + /** + * 根据AppSecret和数据生成相对应的身份认证秘钥 + * @param $appSecret + * @param $data + * @return string + */ + public function getAuthToken( $appSecret, $data ){ + if(empty($data)){ + return ''; + }else{ + $preArr = array_merge($data, array('app_secret' => $appSecret)); + ksort($preArr); + $preStr = http_build_query($preArr); + return md5($preStr); + } + } + + /** + * 计算出唯一的身份令牌 + * @param $appId + * @param $appSecret + * @return string + */ + public function getAccessToken( $appId, $appSecret ){ + $preStr = $appSecret.$appId.time().Str::keyGen(); + return md5($preStr); + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/DataType.class.php b/Application/Home/ORG/DataType.class.php new file mode 100644 index 0000000..9678c5a --- /dev/null +++ b/Application/Home/ORG/DataType.class.php @@ -0,0 +1,29 @@ +<?php +/** + * 数据类型维护 + * 特别注意:这里的数据类型包含但不限于常规数据类型,可能会存在系统自己定义的数据类型 + * @since 2017/03/01 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG; + + +class DataType { + + const TYPE_INTEGER = 1; + const TYPE_STRING = 2; + const TYPE_ARRAY = 3; + const TYPE_FLOAT = 4; + const TYPE_BOOLEAN = 5; + const TYPE_FILE = 6; + const TYPE_ENUM = 7; + const TYPE_MOBILE = 8; + const TYPE_OBJECT = 9; + + //JPush推送消息类型 + const PUSH_SYSTEM_DATA = 1; + const PUSH_ACTIVITY_DATA = 2; + + +} \ No newline at end of file diff --git a/Application/Home/ORG/Date.class.php b/Application/Home/ORG/Date.class.php new file mode 100644 index 0000000..206674c --- /dev/null +++ b/Application/Home/ORG/Date.class.php @@ -0,0 +1,569 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2009 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Home\ORG; +/** + * 日期时间操作类 + * @category ORG + * @package ORG + * @subpackage Date + * @author liu21st <liu21st@gmail.com> + * @version $Id: Date.class.php 2662 2012-01-26 06:32:50Z liu21st $ + */ +class Date { + + /** + * 日期的时间戳 + * @var integer + * @access protected + */ + protected $date; + + /** + * 时区 + * @var integer + * @access protected + */ + protected $timezone; + + /** + * 年 + * @var integer + * @access protected + */ + protected $year; + + /** + * 月 + * @var integer + * @access protected + */ + protected $month; + + /** + * 日 + * @var integer + * @access protected + */ + protected $day; + + /** + * 时 + * @var integer + * @access protected + */ + protected $hour; + + /** + * 分 + * @var integer + * @access protected + */ + protected $minute; + + /** + * 秒 + * @var integer + * @access protected + */ + protected $second; + + /** + * 星期的数字表示 + * @var integer + * @access protected + */ + protected $weekday; + + /** + * 星期的完整表示 + * @var string + * @access protected + */ + protected $cWeekday; + + /** + * 一年中的天数 0-365 + * @var integer + * @access protected + */ + protected $yDay; + + /** + * 月份的完整表示 + * @var string + * @access protected + */ + protected $cMonth; + + /** + * 日期CDATE表示 + * @var string + * @access protected + */ + protected $CDATE; + + /** + * 日期的YMD表示 + * @var string + * @access protected + */ + protected $YMD; + + /** + * 时间的输出表示 + * @var string + * @access protected + */ + protected $CTIME; + + // 星期的输出 + protected $Week = array("日","一","二","三","四","五","六"); + + /** + * 架构函数 + * 创建一个Date对象 + * @param mixed $date 日期 + * @static + * @access public + */ + public function __construct($date='') { + //分析日期 + $this->date = $this->parse($date); + $this->setDate($this->date); + } + + /** + * 日期分析 + * 返回时间戳 + * @static + * @access public + * @param mixed $date 日期 + * @return string + */ + public function parse($date) { + if (is_string($date)) { + if (($date == "") || strtotime($date) == -1) { + //为空默认取得当前时间戳 + $tmpDate = time(); + } else { + //把字符串转换成UNIX时间戳 + $tmpDate = strtotime($date); + } + } elseif (is_null($date)) { + //为空默认取得当前时间戳 + $tmpDate = time(); + + } elseif (is_numeric($date)) { + //数字格式直接转换为时间戳 + $tmpDate = $date; + + } else { + if (get_class($date) == "Date") { + //如果是Date对象 + $tmpDate = $date->date; + } else { + //默认取当前时间戳 + $tmpDate = time(); + } + } + return $tmpDate; + } + + /** + * 验证日期数据是否有效 + * @access public + * @param mixed $date 日期数据 + * @return string + */ + public function valid($date) { + + } + + /** + * 日期参数设置 + * @static + * @access public + * @param integer $date 日期时间戳 + * @return void + */ + public function setDate($date) { + $dateArray = getdate($date); + $this->date = $dateArray[0]; //时间戳 + $this->second = $dateArray["seconds"]; //秒 + $this->minute = $dateArray["minutes"]; //分 + $this->hour = $dateArray["hours"]; //时 + $this->day = $dateArray["mday"]; //日 + $this->month = $dateArray["mon"]; //月 + $this->year = $dateArray["year"]; //年 + + $this->weekday = $dateArray["wday"]; //星期 0~6 + $this->cWeekday = '星期'.$this->Week[$this->weekday];//$dateArray["weekday"]; //星期完整表示 + $this->yDay = $dateArray["yday"]; //一年中的天数 0-365 + $this->cMonth = $dateArray["month"]; //月份的完整表示 + + $this->CDATE = $this->format("%Y-%m-%d");//日期表示 + $this->YMD = $this->format("%Y%m%d"); //简单日期 + $this->CTIME = $this->format("%H:%M:%S");//时间表示 + + return ; + } + + /** + * 日期格式化 + * 默认返回 1970-01-01 11:30:45 格式 + * @access public + * @param string $format 格式化参数 + * @return string + */ + public function format($format = "%Y-%m-%d %H:%M:%S") { + return strftime($format, $this->date); + } + + /** + * 是否为闰年 + * @static + * @access public + * @return string + */ + public function isLeapYear($year='') { + if(empty($year)) { + $year = $this->year; + } + return ((($year % 4) == 0) && (($year % 100) != 0) || (($year % 400) == 0)); + } + + /** + * 计算日期差 + * + * w - weeks + * d - days + * h - hours + * m - minutes + * s - seconds + * @static + * @access public + * @param mixed $date 要比较的日期 + * @param string $elaps 比较跨度 + * @return integer + */ + public function dateDiff($date, $elaps = "d") { + $__DAYS_PER_WEEK__ = (7); + $__DAYS_PER_MONTH__ = (30); + $__DAYS_PER_YEAR__ = (365); + $__HOURS_IN_A_DAY__ = (24); + $__MINUTES_IN_A_DAY__ = (1440); + $__SECONDS_IN_A_DAY__ = (86400); + //计算天数差 + $__DAYSELAPS = ($this->parse($date) - $this->date) / $__SECONDS_IN_A_DAY__ ; + switch ($elaps) { + case "y"://转换成年 + $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_YEAR__; + break; + case "M"://转换成月 + $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_MONTH__; + break; + case "w"://转换成星期 + $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_WEEK__; + break; + case "h"://转换成小时 + $__DAYSELAPS = $__DAYSELAPS * $__HOURS_IN_A_DAY__; + break; + case "m"://转换成分钟 + $__DAYSELAPS = $__DAYSELAPS * $__MINUTES_IN_A_DAY__; + break; + case "s"://转换成秒 + $__DAYSELAPS = $__DAYSELAPS * $__SECONDS_IN_A_DAY__; + break; + } + return $__DAYSELAPS; + } + + /** + * 人性化的计算日期差 + * @static + * @access public + * @param mixed $time 要比较的时间 + * @param mixed $precision 返回的精度 + * @return string + */ + public function timeDiff( $time ,$precision=false) { + if(!is_numeric($precision) && !is_bool($precision)) { + static $_diff = array('y'=>'年','M'=>'个月','d'=>'天','w'=>'周','s'=>'秒','h'=>'小时','m'=>'分钟'); + return ceil($this->dateDiff($time,$precision)).$_diff[$precision].'前'; + } + $diff = abs($this->parse($time) - $this->date); + static $chunks = array(array(31536000,'年'),array(2592000,'个月'),array(604800,'周'),array(86400,'天'),array(3600 ,'小时'),array(60,'分钟'),array(1,'秒')); + $count =0; + $since = ''; + for($i=0;$i<count($chunks);$i++) { + if($diff>=$chunks[$i][0]) { + $num = floor($diff/$chunks[$i][0]); + $since .= sprintf('%d'.$chunks[$i][1],$num); + $diff = (int)($diff-$chunks[$i][0]*$num); + $count++; + if(!$precision || $count>=$precision) { + break; + } + } + } + return $since.'前'; + } + + /** + * 返回周的某一天 返回Date对象 + * @access public + * @return Date + */ + public function getDayOfWeek($n){ + $week = array(0=>'sunday',1=>'monday',2=>'tuesday',3=>'wednesday',4=>'thursday',5=>'friday',6=>'saturday'); + return (new Date($week[$n])); + } + + /** + * 计算周的第一天 返回Date对象 + * @access public + * @return Date + */ + public function firstDayOfWeek() { + return $this->getDayOfWeek(1); + } + + /** + * 计算月份的第一天 返回Date对象 + * @access public + * @return Date + */ + public function firstDayOfMonth() { + return (new Date(mktime(0, 0, 0,$this->month,1,$this->year ))); + } + + /** + * 计算年份的第一天 返回Date对象 + * @access public + * @return Date + */ + public function firstDayOfYear() { + return (new Date(mktime(0, 0, 0, 1, 1, $this->year))); + } + + /** + * 计算周的最后一天 返回Date对象 + * @access public + * @return Date + */ + public function lastDayOfWeek() { + return $this->getDayOfWeek(0); + } + + /** + * 计算月份的最后一天 返回Date对象 + * @access public + * @return Date + */ + public function lastDayOfMonth() { + return (new Date(mktime(0, 0, 0, $this->month + 1, 0, $this->year ))); + } + + /** + * 计算年份的最后一天 返回Date对象 + * @access public + * @return Date + */ + public function lastDayOfYear() { + return (new Date(mktime(0, 0, 0, 1, 0, $this->year + 1))); + } + + /** + * 计算月份的最大天数 + * @access public + * @return integer + */ + public function maxDayOfMonth() { + $result = $this->dateDiff(strtotime($this->dateAdd(1,'m')),'d'); + return $result; + } + + /** + * 取得指定间隔日期 + * + * yyyy - 年 + * q - 季度 + * m - 月 + * y - day of year + * d - 日 + * w - 周 + * ww - week of year + * h - 小时 + * n - 分钟 + * s - 秒 + * @access public + * @param integer $number 间隔数目 + * @param string $interval 比较类型 + * @return Date + */ + public function dateAdd($number = 0, $interval = "d") { + $hours = $this->hour; + $minutes = $this->minute; + $seconds = $this->second; + $month = $this->month; + $day = $this->day; + $year = $this->year; + + switch ($interval) { + case "yyyy": + //---Add $number to year + $year += $number; + break; + + case "q": + //---Add $number to quarter + $month += ($number*3); + break; + + case "m": + //---Add $number to month + $month += $number; + break; + + case "y": + case "d": + case "w": + //---Add $number to day of year, day, day of week + $day += $number; + break; + + case "ww": + //---Add $number to week + $day += ($number*7); + break; + + case "h": + //---Add $number to hours + $hours += $number; + break; + + case "n": + //---Add $number to minutes + $minutes += $number; + break; + + case "s": + //---Add $number to seconds + $seconds += $number; + break; + } + + return (new Date(mktime($hours, + $minutes, + $seconds, + $month, + $day, + $year))); + + } + + /** + * 日期数字转中文 + * 用于日和月、周 + * @static + * @access public + * @param integer $number 日期数字 + * @return string + */ + public function numberToCh($number) { + $number = intval($number); + $array = array('一','二','三','四','五','六','七','八','九','十'); + $str = ''; + if($number ==0) { $str .= "十" ;} + if($number < 10){ + $str .= $array[$number-1] ; + } + elseif($number < 20 ){ + $str .= "十".$array[$number-11]; + } + elseif($number < 30 ){ + $str .= "二十".$array[$number-21]; + } + else{ + $str .= "三十".$array[$number-31]; + } + return $str; + } + + /** + * 年份数字转中文 + * @static + * @access public + * @param integer $yearStr 年份数字 + * @param boolean $flag 是否显示公元 + * @return string + */ + public function yearToCh( $yearStr ,$flag=false ) { + $array = array('零','一','二','三','四','五','六','七','八','九'); + $str = $flag? '公元' : ''; + for($i=0;$i<4;$i++){ + $str .= $array[substr($yearStr,$i,1)]; + } + return $str; + } + + /** + * 判断日期 所属 干支 生肖 星座 + * type 参数:XZ 星座 GZ 干支 SX 生肖 + * + * @static + * @access public + * @param string $type 获取信息类型 + * @return string + */ + public function magicInfo($type) { + $result = ''; + $m = $this->month; + $y = $this->year; + $d = $this->day; + + switch ($type) { + case 'XZ'://星座 + $XZDict = array('摩羯','宝瓶','双鱼','白羊','金牛','双子','巨蟹','狮子','处女','天秤','天蝎','射手'); + $Zone = array(1222,122,222,321,421,522,622,722,822,922,1022,1122,1222); + if((100*$m+$d)>=$Zone[0]||(100*$m+$d)<$Zone[1]) + $i=0; + else + for($i=1;$i<12;$i++){ + if((100*$m+$d)>=$Zone[$i]&&(100*$m+$d)<$Zone[$i+1]) + break; + } + $result = $XZDict[$i].'座'; + break; + + case 'GZ'://干支 + $GZDict = array( + array('甲','乙','丙','丁','戊','己','庚','辛','壬','癸'), + array('子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥') + ); + $i= $y -1900+36 ; + $result = $GZDict[0][$i%10].$GZDict[1][$i%12]; + break; + + case 'SX'://生肖 + $SXDict = array('鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪'); + $result = $SXDict[($y-4)%12]; + break; + + } + return $result; + } + + public function __toString() { + return $this->format(); + } +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter.class.php b/Application/Home/ORG/Filter.class.php new file mode 100644 index 0000000..21f298f --- /dev/null +++ b/Application/Home/ORG/Filter.class.php @@ -0,0 +1,156 @@ +<?php +/** + * API数据过滤 + * @since 2017/02/28 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG; + + +use Home\ORG\Filter\ArrayFilter; +use Home\ORG\Filter\EnumFilter; +use Home\ORG\Filter\FloatFilter; +use Home\ORG\Filter\IntegerFilter; +use Home\ORG\Filter\OtherFilter; +use Home\ORG\Filter\StringFilter; + +class Filter { + + /** + * 返回参数过滤(主要是将返回参数的数据类型给规范) + * @param array $data + * @param array $rule + * @return array + */ + public function response($data, $rule = array()) { + $newRule = array(); + foreach ($rule as $item) { + $newRule[$item['showName']] = $item['dataType']; + } + if (is_array($data)) { + $this->handle($data, $newRule); + } elseif (empty($data)) { + if ($newRule['data'] == DataType::TYPE_OBJECT) { + $data = (object)array(); + } elseif ($newRule['data'] == DataType::TYPE_ARRAY) { + $data = array(); + } + } + + return $data; + } + + private function handle(&$data, $rule, $prefix = 'data') { + if (empty($data)) { + if ($rule[$prefix] == DataType::TYPE_OBJECT) { + $data = (object)array(); + } + } else { + if ($rule[$prefix] == DataType::TYPE_OBJECT) { + $prefix .= '{}'; + foreach ($data as $index => &$datum) { + $myPre = $prefix . $index; + switch ($rule[$myPre]) { + case DataType::TYPE_INTEGER: + $datum = intval($datum); + break; + case DataType::TYPE_FLOAT: + $datum = floatval($datum); + break; + case DataType::TYPE_STRING: + $datum = strval($datum); + break; + default: + $this->handle($datum, $rule, $myPre); + break; + } + } + } else { + $prefix .= '[]'; + if (is_array($data[0])) { + foreach ($data as &$datum) { + $this->handle($datum, $rule, $prefix); + } + } + } + } + } + + /** + * 请求参数过滤(主要是判断字段的合法性) + * @param $data + * @param array $rule + */ + public function request(&$data, $rule = array()) { + $newData = array(); + foreach ($rule as $value) { + if (!isset($data[$value['fieldName']])) { + if ($value['isMust']) { + Response::error(ReturnCode::EMPTY_PARAMS, '缺少必要参数:' . $value['fieldName']); + } else { + if ($value['default'] === '') { + continue; + } else { + $data[$value['fieldName']] = $value['default']; + } + } + } + if (isset($data[$value['fieldName']])) { + $newData[$value['fieldName']] = $data[$value['fieldName']]; + } + if ($value['range']) { + $value['range'] = htmlspecialchars_decode($value['range']); + } + switch ($value['dataType']) { + case DataType::TYPE_INTEGER: + $checkObj = new IntegerFilter(); + if ($value['isMust'] && $newData[$value['fieldName']] == '') { + Response::error(ReturnCode::EMPTY_PARAMS, '字段[' . $value['fieldName'] . ']不能为空'); + } + if ($newData[$value['fieldName']] != '') { + $checkObj->parse($newData[$value['fieldName']], json_decode($value['range'], true), $value['fieldName']); + } + break; + case DataType::TYPE_STRING: + $checkObj = new StringFilter(); + if ($value['isMust'] && $newData[$value['fieldName']] == '') { + Response::error(ReturnCode::EMPTY_PARAMS, '字段[' . $value['fieldName'] . ']不能为空'); + } + $newData[$value['fieldName']] = trim($newData[$value['fieldName']]); + if ($newData[$value['fieldName']] != '') { + $checkObj->parse($newData[$value['fieldName']], json_decode($value['range'], true), $value['fieldName']); + } + break; + case DataType::TYPE_ENUM: + $checkObj = new EnumFilter(); + if ($value['isMust'] && $newData[$value['fieldName']] == '') { + Response::error(ReturnCode::EMPTY_PARAMS, '字段[' . $value['fieldName'] . ']不能为空'); + } + if ($newData[$value['fieldName']] != '') { + $checkObj->parse($newData[$value['fieldName']], json_decode($value['range'], true), $value['fieldName']); + } + break; + case DataType::TYPE_FLOAT: + $checkObj = new FloatFilter(); + if ($value['isMust'] && empty($newData[$value['fieldName']]) && $newData[$value['fieldName']] != 0) { + Response::error(ReturnCode::EMPTY_PARAMS, '字段[' . $value['fieldName'] . ']不能为空'); + } + $newData[$value['fieldName']] = trim($newData[$value['fieldName']]); + $checkObj->parse($newData[$value['fieldName']], json_decode($value['range'], true), $value['fieldName']); + break; + case DataType::TYPE_ARRAY: + $checkObj = new ArrayFilter(); + $checkObj->parse($newData[$value['fieldName']], json_decode($value['range'], true), $value['fieldName']); + break; + case DataType::TYPE_MOBILE: + $checkObj = new OtherFilter(); + $newData[$value['fieldName']] = trim($newData[$value['fieldName']]); + $checkObj->isMobile($newData[$value['fieldName']], json_decode($value['range'], true), $value['fieldName']); + break; + } + } + $data = $newData; + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter/ArrayFilter.class.php b/Application/Home/ORG/Filter/ArrayFilter.class.php new file mode 100644 index 0000000..976aebe --- /dev/null +++ b/Application/Home/ORG/Filter/ArrayFilter.class.php @@ -0,0 +1,23 @@ +<?php +/** + * + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\Filter; + +use Home\ORG\Response; +use Home\ORG\ReturnCode; +class ArrayFilter extends Base { + + public function parse(&$value, $rule, $fieldName) { + $this->fieldName = $fieldName; + if(!is_array($value)) { + Response::error(ReturnCode::TYPE_ERROR, "字段[{$fieldName}]字段类型不合法,期望数据类型为:Array"); + } elseif (!empty($rule)) { + $this->filterByRange(count($value), $rule); + } + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter/Base.class.php b/Application/Home/ORG/Filter/Base.class.php new file mode 100644 index 0000000..18092b6 --- /dev/null +++ b/Application/Home/ORG/Filter/Base.class.php @@ -0,0 +1,42 @@ +<?php +/** + * + * @since 2017/03/01 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\Filter; + + +use Home\ORG\Response; +use Home\ORG\ReturnCode; + +class Base { + + protected $fieldName; + + protected function filterByRange($value, $rule) { + $this->checkSetting($rule); + $this->checkMin($value, $rule); + $this->checkMax($value, $rule); + } + + protected function checkSetting($rule) { + if (isset($rule['min']) && isset($rule['max']) && $rule['min'] > $rule['max']) { + Response::error(ReturnCode::NUMBER_MATCH_ERROR, "字段[{$this->fieldName}]的系统配置矛盾,请检测"); + } + } + + protected function checkMin($value, $rule) { + if (isset($rule['min']) && $value < $rule['min']) { + Response::error(ReturnCode::NUMBER_MATCH_ERROR, "字段[{$this->fieldName}]不合法,系统要求最小值为:". $rule['min']); + } + } + + protected function checkMax($value, $rule) { + if (isset($rule['max']) && $value > $rule['max']) { + Response::error(ReturnCode::NUMBER_MATCH_ERROR, "字段[{$this->fieldName}]不合法,系统要求最大值为:". $rule['max']); + } + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter/EnumFilter.class.php b/Application/Home/ORG/Filter/EnumFilter.class.php new file mode 100644 index 0000000..9ea525a --- /dev/null +++ b/Application/Home/ORG/Filter/EnumFilter.class.php @@ -0,0 +1,22 @@ +<?php +/** + * + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\Filter; + +use Home\ORG\Response; +use Home\ORG\ReturnCode; + +class EnumFilter extends Base { + + public function parse(&$value, $rule, $fieldName){ + $this->fieldName = $fieldName; + if( !empty($rule) && !in_array($value, $rule) ){ + Response::error(ReturnCode::PARAM_INVALID, "字段[{$fieldName}]取值超出允许范围"); + } + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter/FloatFilter.class.php b/Application/Home/ORG/Filter/FloatFilter.class.php new file mode 100644 index 0000000..b266bda --- /dev/null +++ b/Application/Home/ORG/Filter/FloatFilter.class.php @@ -0,0 +1,20 @@ +<?php +/** + * + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\Filter; + + +class FloatFilter extends Base { + + public function parse(&$value, $rule, $fieldName){ + $this->fieldName = $fieldName; + $value = floatval($value); + if( !empty($rule) ){ + $this->filterByRange($value, $rule); + } + } +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter/IntegerFilter.class.php b/Application/Home/ORG/Filter/IntegerFilter.class.php new file mode 100644 index 0000000..4bf2dc9 --- /dev/null +++ b/Application/Home/ORG/Filter/IntegerFilter.class.php @@ -0,0 +1,20 @@ +<?php +/** + * + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\Filter; + + +class IntegerFilter extends Base { + + public function parse(&$value, $rule, $fieldName){ + $this->fieldName = $fieldName; + $value = intval($value); + if( !empty($rule) ){ + $this->filterByRange($value, $rule); + } + } +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter/OtherFilter.class.php b/Application/Home/ORG/Filter/OtherFilter.class.php new file mode 100644 index 0000000..918b70b --- /dev/null +++ b/Application/Home/ORG/Filter/OtherFilter.class.php @@ -0,0 +1,23 @@ +<?php +/** + * + * @since 2017/03/14 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\Filter; + + +use Home\ORG\Response; +use Home\ORG\ReturnCode; + +class OtherFilter extends Base { + + public function isMobile(&$value, $rule, $fieldName){ + $this->fieldName = $fieldName; + if( !preg_match('/^1[34578]\d{9}$/', $value) ){ + Response::error(ReturnCode::PARAM_INVALID, "请输入正确的11位手机号码"); + } + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/Filter/StringFilter.class.php b/Application/Home/ORG/Filter/StringFilter.class.php new file mode 100644 index 0000000..653faa7 --- /dev/null +++ b/Application/Home/ORG/Filter/StringFilter.class.php @@ -0,0 +1,24 @@ +<?php +/** + * + * @since 2017/03/02 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\Filter; + +use Home\ORG\Response; +use Home\ORG\ReturnCode; +class StringFilter extends Base { + + public function parse(&$value, $rule, $fieldName){ + $this->fieldName = $fieldName; + if (!is_string($value)) { + Response::error(ReturnCode::TYPE_ERROR, "字段[$fieldName]数据类型不合法,期望类型应该为:String"); + } else { + if( !empty($rule) ){ + $this->filterByRange(strlen($value), $rule); + } + } + } +} \ No newline at end of file diff --git a/Application/Home/ORG/JPush/Config.class.php b/Application/Home/ORG/JPush/Config.class.php new file mode 100644 index 0000000..1c5fc81 --- /dev/null +++ b/Application/Home/ORG/JPush/Config.class.php @@ -0,0 +1,55 @@ +<?php +/** + * + * @since 2017/03/24 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\JPush; + + +class Config { + + const APP_KEY = '884fc6fb9fb466e11def006a'; + const MASTER_SECRET = '11c72c7fad4110472a688973'; + + //推送API + const API_PUSH = 'https://api.jpush.cn/v3/push'; + //推送校验 API + const API_VALIDATE = 'https://api.jpush.cn/v3/push/validate'; + //送达统计 + const API_RECEIVED = 'https://report.jpush.cn/v3/received'; + //消息统计 + const API_MESSAGE = 'https://report.jpush.cn/v3/messages'; + //用户统计 + const API_USERS = 'https://report.jpush.cn/v3/users'; + //查询设备的别名与标签(设置设备的别名与标签) + const API_DEVICES = 'https://device.jpush.cn/v3/devices'; + //查询别名(删除别名) + const API_ALIASES = 'https://device.jpush.cn/v3/aliases'; + //查询标签列表(判断设备与标签绑定关系/更新标签/删除标签) + const API_TAG = 'https://device.jpush.cn/v3/tags'; + //获取用户在线状态 + const API_STATUS = 'https://device.jpush.cn/v3/devices/status/'; + //定时任务相关 + const API_SCHEDULES = 'https://api.jpush.cn/v3/schedules'; + + const HTTP_POST = 1; + const HTTP_GET = 2; + const HTTP_PUT = 3; + const HTTP_DELETE = 4; + + const PLATFORM_ANDROID = 'android'; + const PLATFORM_IOS = 'ios'; + + const DISABLE_SOUND = "_disable_Sound"; + const DISABLE_BADGE = 0x10000; + const USER_AGENT = 'JPush-API-PHP-Client'; + const CONNECT_TIMEOUT = 1; + //请求最长耗时 + const READ_TIMEOUT = 120; + //重连次数 + const DEFAULT_MAX_RETRY_TIMES = 3; + const DEFAULT_LOG_FILE = "./jpush.log"; + +} \ No newline at end of file diff --git a/Application/Home/ORG/JPush/Device.class.php b/Application/Home/ORG/JPush/Device.class.php new file mode 100644 index 0000000..4eed645 --- /dev/null +++ b/Application/Home/ORG/JPush/Device.class.php @@ -0,0 +1,13 @@ +<?php +/** + * + * @since 2017/03/24 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\JPush; + + +class Device { + +} \ No newline at end of file diff --git a/Application/Home/ORG/JPush/Http.class.php b/Application/Home/ORG/JPush/Http.class.php new file mode 100644 index 0000000..3d5b06d --- /dev/null +++ b/Application/Home/ORG/JPush/Http.class.php @@ -0,0 +1,146 @@ +<?php +/** + * + * @since 2017/03/24 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\JPush; + + +use Home\ORG\Response; +use Home\ORG\ReturnCode; + +class Http { + + public static function get($url) { + $response = self::sendRequest($url, Config::HTTP_GET, $body = null); + + return self::processResp($response); + } + + public static function post($url, $body) { + $response = self::sendRequest($url, Config::HTTP_POST, $body); + + return self::processResp($response); + } + + public static function put($url, $body) { + $response = self::sendRequest($url, Config::HTTP_PUT, $body); + + return self::processResp($response); + } + + public static function delete($url) { + $response = self::sendRequest($url, Config::HTTP_DELETE, $body = null); + + return self::processResp($response); + } + + private static function sendRequest($url, $method, $body = null, $times = 1) { + if (!defined('CURL_HTTP_VERSION_2_0')) { + define('CURL_HTTP_VERSION_2_0', 3); + } + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_USERAGENT, Config::USER_AGENT); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, Config::CONNECT_TIMEOUT); + curl_setopt($ch, CURLOPT_TIMEOUT, Config::READ_TIMEOUT); // 请求最长耗时 + // 设置SSL版本 1=CURL_SSLVERSION_TLSv1, 不指定使用默认值,curl会自动获取需要使用的CURL版本 + // curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + // 如果报证书相关失败,可以考虑取消注释掉该行,强制指定证书版本 + //curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); + + // 设置Basic认证 + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($ch, CURLOPT_USERPWD, Config::APP_KEY . ':' . Config::MASTER_SECRET); + curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); + + // 设置Post参数 + switch ($method) { + case Config::HTTP_POST: + curl_setopt($ch, CURLOPT_POST, true); + break; + case Config::HTTP_DELETE: + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); + break; + case Config::HTTP_PUT: + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); + break; + } + + if (!is_null($body)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); + } + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + 'Content-Type: application/json', + 'Connection: Keep-Alive' + )); + + $output = curl_exec($ch); + $response = array(); + $errorCode = curl_errno($ch); + + $msg = ''; + if (isset($body['options']['sendno'])) { + $sendNo = $body['options']['sendno']; + $msg = 'sendno: ' . $sendNo; + } + + + if ($errorCode) { + if ($times < Config::DEFAULT_MAX_RETRY_TIMES) { + return self::sendRequest($url, $method, $body, ++$times); + } else { + if ($errorCode === 28) { + Response::error(ReturnCode::CURL_ERROR, $msg . "Response timeout. Your request has probably be received by JPush Server,please check that whether need to be pushed again."); + } elseif ($errorCode === 56) { + Response::error(ReturnCode::CURL_ERROR, $msg . "Response timeout, maybe cause by old CURL version. Your request has probably be received by JPush Server, please check that whether need to be pushed again."); + } else { + Response::error(ReturnCode::CURL_ERROR, $msg . "Connect timeout, Please retry later. Error:" . $errorCode . " " . curl_error($ch)); + } + } + } else { + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + $headerText = substr($output, 0, $headerSize); + $body = substr($output, $headerSize); + $headers = array(); + foreach (explode("\r\n", $headerText) as $i => $line) { + if (!empty($line)) { + if ($i === 0) { + $headers[0] = $line; + } else if (strpos($line, ": ")) { + list ($key, $value) = explode(': ', $line); + $headers[$key] = $value; + } + } + } + $response['headers'] = $headers; + $response['body'] = $body; + $response['httpCode'] = $httpCode; + } + curl_close($ch); + + return $response; + } + + public static function processResp($response) { + $data = json_decode($response['body'], true); + + if (is_null($data)) { + Response::error(ReturnCode::CURL_ERROR, '未收到返回数据'); + } elseif ($response['httpCode'] === 200) { + $result = array(); + $result['body'] = $data; + $result['httpCode'] = $response['httpCode']; + $result['headers'] = $response['headers']; + + return $result; + } + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/JPush/Push.class.php b/Application/Home/ORG/JPush/Push.class.php new file mode 100644 index 0000000..75782d1 --- /dev/null +++ b/Application/Home/ORG/JPush/Push.class.php @@ -0,0 +1,444 @@ +<?php +/** + * JPush推送实现 + * @since 2017/03/24 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\JPush; + + +use Home\ORG\Response; +use Home\ORG\ReturnCode; +use Home\ORG\Str; + +class Push { + private $platform = 'all'; + private $tag = null; + private $tagAnd = null; + private $alias = null; + private $registrationId = null; + private $extras = null; + private $notificationAlert = null; + private $androidNotification = null; + private $iosNotification = null; + private $message = null; + private $options = null; + + /** + * 增加推送到苹果 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function ios() { + if (is_array($this->platform)) { + if (!in_array(Config::PLATFORM_IOS, $this->platform)) { + array_push($this->platform, Config::PLATFORM_IOS); + } + } else { + $this->platform = array(Config::PLATFORM_IOS); + } + + return $this; + } + + /** + * 推送至安卓 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function android() { + if (is_array($this->platform)) { + if (!in_array(Config::PLATFORM_ANDROID, $this->platform)) { + array_push($this->platform, Config::PLATFORM_ANDROID); + } + } else { + $this->platform = array(Config::PLATFORM_ANDROID); + } + + return $this; + } + + /** + * 设置推送tag,仅允许传入字符串和一维索引数组 + * @param string|array $param + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function addTag($param) { + if (is_null($this->tag)) { + if (is_array($this->tag)) { + $this->tag = $param; + } else { + $this->tag = array($param); + } + } else { + if (is_array($param)) { + foreach ($param as $item) { + if (!in_array($item, $this->tag)) { + array_push($this->tag, $item); + } + } + } else { + if (!in_array($param, $this->tag)) { + array_push($this->tag, $param); + } + } + } + + return $this; + } + + /** + * 设置推送tag_and,仅允许传入字符串和一维索引数组 + * @param string|array $param + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function addTagAnd($param) { + if (is_null($this->tagAnd)) { + if (is_array($this->tagAnd)) { + $this->tagAnd = $param; + } else { + $this->tagAnd = array($param); + } + } else { + if (is_array($param)) { + foreach ($param as $item) { + if (!in_array($item, $this->tagAnd)) { + array_push($this->tagAnd, $item); + } + } + } else { + if (!in_array($param, $this->tagAnd)) { + array_push($this->tagAnd, $param); + } + } + } + + return $this; + } + + /** + * 设置推送alias,仅允许传入字符串和一维索引数组 + * @param string|array $param + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function addAlias($param) { + if (is_null($this->alias)) { + if (is_array($this->alias)) { + $this->alias = $param; + } else { + $this->alias = array($param); + } + } else { + if (is_array($param)) { + foreach ($param as $item) { + if (!in_array($item, $this->alias)) { + array_push($this->alias, $item); + } + } + } else { + if (!in_array($param, $this->alias)) { + array_push($this->alias, $param); + } + } + } + + return $this; + } + + /** + * 设置推送registration_id,仅允许传入字符串和一维索引数组 + * @param string|array $param + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function addRegistrationId($param) { + if (is_null($this->registrationId)) { + if (is_array($this->registrationId)) { + $this->registrationId = $param; + } else { + $this->registrationId = array($param); + } + } else { + if (is_array($param)) { + foreach ($param as $item) { + if (!in_array($item, $this->registrationId)) { + array_push($this->registrationId, $item); + } + } + } else { + if (!in_array($param, $this->registrationId)) { + array_push($this->registrationId, $param); + } + } + } + + return $this; + } + + /** + * 设置公告消息 + * @param string $param + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function setNotificationAlert($param) { + if (!is_string($param)) { + Response::error(ReturnCode::EXCEPTION, 'NotificationAlert 必须是字符串'); + } + $this->notificationAlert = $param; + + return $this; + } + + /** + * 设置推送addExtras,新增加额外字段 + * @param array $param + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function addExtras($param) { + if (is_null($this->extras)) { + if (is_array($param)) { + $this->extras = $param; + } + } else { + if (is_array($param)) { + array_merge($this->extras, $param); + } + } + + return $this; + } + + /** + * 设置IOS的通知消息体 + * @param $alert + * @param array $notification + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function iosNotification($alert, $notification = array()) { + $ios = array(); + $ios['alert'] = (is_string($alert) || is_array($alert)) ? $alert : ''; + if (!empty($notification)) { + if (isset($notification['sound']) && is_string($notification['sound'])) { + $ios['sound'] = $notification['sound']; + } + if (isset($notification['badge'])) { + $ios['badge'] = (int)$notification['badge'] ? $notification['badge'] : 0; + } + if (isset($notification['content-available']) && is_bool($notification['content-available']) && $notification['content-available']) { + $ios['content-available'] = $notification['content-available']; + } + if (isset($notification['mutable-content']) && is_bool($notification['mutable-content']) && $notification['mutable-content']) { + $ios['mutable-content'] = $notification['mutable-content']; + } + if (isset($notification['category']) && is_string($notification['category'])) { + $ios['category'] = $notification['category']; + } + if (isset($notification['extras']) && is_array($notification['extras']) && !empty($notification['extras'])) { + $ios['extras'] = $notification['extras']; + } + } + if (!isset($ios['sound'])) { + $ios['sound'] = ''; + } + if (!isset($ios['badge'])) { + $ios['badge'] = '+1'; + } + $this->iosNotification = $ios; + + return $this; + } + + /** + * 设置Android的通知消息体 + * @param $alert + * @param array $notification + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function androidNotification($alert, array $notification = array()) { + $android = array(); + $android['alert'] = is_string($alert) ? $alert : ''; + if (!empty($notification)) { + if (isset($notification['title']) && is_string($notification['title'])) { + $android['title'] = $notification['title']; + } + if (isset($notification['builder_id']) && is_int($notification['builder_id'])) { + $android['builder_id'] = $notification['builder_id']; + } + if (isset($notification['extras']) && is_array($notification['extras']) && !empty($notification['extras'])) { + $android['extras'] = $notification['extras']; + } + if (isset($notification['priority']) && is_int($notification['priority'])) { + $android['priority'] = $notification['priority']; + } + if (isset($notification['category']) && is_string($notification['category'])) { + $android['category'] = $notification['category`']; + } + if (isset($notification['style']) && is_int($notification['style'])) { + $android['style'] = $notification['style']; + } + if (isset($notification['big_text']) && is_string($notification['big_text'])) { + $android['big_text'] = $notification['big_text']; + } + if (isset($notification['inbox']) && is_array($notification['inbox'])) { + $android['inbox'] = $notification['inbox']; + } + if (isset($notification['big_pic_path']) && is_string($notification['big_pic_path'])) { + $android['big_pic_path'] = $notification['big_pic_path']; + } + } + $this->androidNotification = $android; + + return $this; + } + + /** + * 自定义消息体设置 + * @param $msgContent + * @param array $msg + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function message($msgContent, array $msg = array()) { + if (is_string($msgContent)) { + $message = array(); + $message['msg_content'] = $msgContent; + if (!empty($msg)) { + if (isset($msg['title']) && is_string($msg['title'])) { + $message['title'] = $msg['title']; + } + if (isset($msg['content_type']) && is_string($msg['content_type'])) { + $message['content_type'] = $msg['content_type']; + } + if (isset($msg['extras']) && is_array($msg['extras']) && !empty($msg['extras'])) { + $message['extras'] = $msg['extras']; + } + } + $this->message = $message; + } + + return $this; + } + + /** + * 额外可选配置参数 + * @param array $opts + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return $this + */ + public function options(array $opts = array()) { + $options = array(); + if (isset($opts['sendno']) && is_int($opts['sendno'])) { + $options['sendno'] = $opts['sendno']; + } + if (isset($opts['time_to_live']) && is_int($opts['time_to_live']) && $opts['time_to_live'] <= 864000 && $opts['time_to_live'] >= 0) { + $options['time_to_live'] = $opts['time_to_live']; + } + if (isset($opts['override_msg_id']) && is_long($opts['override_msg_id'])) { + $options['override_msg_id'] = $opts['override_msg_id']; + } + if (isset($opts['apns_production']) && is_bool($opts['apns_production'])) { + $options['apns_production'] = $opts['apns_production']; + } else { + $options['apns_production'] = false; + } + if (isset($opts['big_push_duration']) && is_int($opts['big_push_duration']) && $opts['big_push_duration'] <= 1400 && $opts['big_push_duration'] >= 0) { + $options['big_push_duration'] = $opts['big_push_duration']; + } + $this->options = $options; + + return $this; + } + + /** + * 根据配置,整合数据 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + * @return array + */ + private function buildData() { + $payload = array(); + $payload["platform"] = $this->platform; + + $audience = array(); + if (!is_null($this->tag)) { + $audience["tag"] = $this->tag; + } + if (!is_null($this->tagAnd)) { + $audience["tag_and"] = $this->tagAnd; + } + if (!is_null($this->alias)) { + $audience["alias"] = $this->alias; + } + if (!is_null($this->registrationId)) { + $audience["registration_id"] = $this->registrationId; + } + if (count($audience) <= 0) { + $payload["audience"] = 'all'; + } else { + $payload["audience"] = $audience; + } + + $notification = array(); + if (!is_null($this->notificationAlert)) { + $notification['alert'] = $this->notificationAlert; + } + if (!is_null($this->androidNotification)) { + $notification['android'] = $this->androidNotification; + if (is_null($this->androidNotification['alert'])) { + if (is_null($this->notificationAlert)) { + Response::error(ReturnCode::EXCEPTION, 'Android alert can not be null'); + } else { + $notification['android']['alert'] = $this->notificationAlert; + } + } + } else { + if (!is_null($this->extras)) { + $notification['android']['extras'] = $this->extras; + } + } + + if (!is_null($this->iosNotification)) { + $notification['ios'] = $this->iosNotification; + if (is_null($this->iosNotification['alert'])) { + if (is_null($this->notificationAlert)) { + Response::error(ReturnCode::EXCEPTION, 'iOS alert can not be null'); + } else { + $notification['ios']['alert'] = $this->notificationAlert; + } + } + } else { + if (!is_null($this->extras)) { + $notification['ios']['extras'] = $this->extras; + } + } + + if (count($notification) > 0) { + $payload['notification'] = $notification; + } + + if (count($this->message) > 0) { + $payload['message'] = $this->message; + } + + if (!array_key_exists('notification', $payload) && !array_key_exists('message', $payload)) { + Response::error(ReturnCode::EXCEPTION, 'notification and message can not all be null'); + } + + if (!is_null($this->options)) { + $payload['options'] = $this->options; + } + + return $payload; + } + + public function send() { + return Http::post(Config::API_PUSH, $this->buildData()); + } +} \ No newline at end of file diff --git a/Application/Home/ORG/JPush/Report.class.php b/Application/Home/ORG/JPush/Report.class.php new file mode 100644 index 0000000..30d814a --- /dev/null +++ b/Application/Home/ORG/JPush/Report.class.php @@ -0,0 +1,13 @@ +<?php +/** + * + * @since 2017/03/24 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\JPush; + + +class Report { + +} \ No newline at end of file diff --git a/Application/Home/ORG/JPush/Schedule.class.php b/Application/Home/ORG/JPush/Schedule.class.php new file mode 100644 index 0000000..9e2b78d --- /dev/null +++ b/Application/Home/ORG/JPush/Schedule.class.php @@ -0,0 +1,13 @@ +<?php +/** + * + * @since 2017/03/24 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG\JPush; + + +class Schedule { + +} \ No newline at end of file diff --git a/Application/Home/ORG/JPushSDK.class.php b/Application/Home/ORG/JPushSDK.class.php new file mode 100644 index 0000000..8d70ee8 --- /dev/null +++ b/Application/Home/ORG/JPushSDK.class.php @@ -0,0 +1,33 @@ +<?php +/** + * 极光推送Manager + * @since 2017/03/24 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG; + + +use Home\ORG\JPush\Device; +use Home\ORG\JPush\Push; +use Home\ORG\JPush\Report; +use Home\ORG\JPush\Schedule; + +class JPushSDK { + + public static function push() { + return new Push(); + } + + public static function report() { + return new Report(); + } + + public static function device() { + return new Device(); + } + + public static function schedule() { + return new Schedule(); + } +} \ No newline at end of file diff --git a/Application/Home/ORG/Response.class.php b/Application/Home/ORG/Response.class.php new file mode 100644 index 0000000..35ebbc7 --- /dev/null +++ b/Application/Home/ORG/Response.class.php @@ -0,0 +1,92 @@ +<?php +/** + * 输出类库 + * @since 2017-03-14 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG; + + +class Response { + + static private $debugInfo = array(); + static private $dataType; + static private $successMsg = null; + + /** + * 设置Debug信息 + * @param $info + */ + static public function debug($info) { + if (APP_DEBUG) { + array_push(self::$debugInfo, $info); + } + } + + /** + * 设置data字段数据类型(规避空数组json_encode导致的数据类型混乱) + * @param string $msg + */ + static public function setSuccessMsg($msg) { + self::$successMsg = $msg; + } + + /** + * 设置data字段数据类型(规避空数组json_encode导致的数据类型混乱) + * @param int $type + */ + static public function setDataType($type = DataType::TYPE_OBJECT) { + self::$dataType = $type; + } + + /** + * 错误输出 + * @param integer $code 错误码,必填! + * @param string $msg 错误信息,选填,但是建议必须有! + * @param array $data + */ + static public function error($code, $msg = '', $data = array()) { + $returnData = array( + 'code' => $code, + 'msg' => $msg, + 'data' => $data + ); + if (!empty(self::$debugInfo)) { + $returnData['debug'] = self::$debugInfo; + } + header('Content-Type:application/json; charset=utf-8'); + if (self::$dataType == DataType::TYPE_OBJECT && empty($data)) { + $returnStr = json_encode($returnData, JSON_FORCE_OBJECT); + } else { + $returnStr = json_encode($returnData); + } + ApiLog::setResponse($returnStr); + ApiLog::save(); + exit($returnStr); + } + + /** + * 成功返回 + * @param $data + * @param null $code + */ + static public function success($data, $code = null) { + $code = is_null($code) ? ReturnCode::SUCCESS : $code; + $msg = is_null(self::$successMsg) ? '操作成功' : self::$successMsg; + $returnData = array( + 'code' => $code, + 'msg' => $msg, + 'data' => $data + ); + if (!empty(self::$debugInfo)) { + $returnData['debug'] = self::$debugInfo; + } + header('Content-Type:application/json; charset=utf-8'); + $returnStr = json_encode($returnData); + ApiLog::setResponse($returnStr); + ApiLog::save(); + exit($returnStr); + } + +} \ No newline at end of file diff --git a/Application/Home/ORG/ReturnCode.class.php b/Application/Home/ORG/ReturnCode.class.php new file mode 100644 index 0000000..238d38e --- /dev/null +++ b/Application/Home/ORG/ReturnCode.class.php @@ -0,0 +1,45 @@ +<?php +/** + * 错误码统一维护 + * @since 2017/02/28 创建 + * @author zhaoxiang <zhaoxiang051405@gmail.com> + */ + +namespace Home\ORG; + + +class ReturnCode { + + const SUCCESS = 1; + const INVALID = -1; + const DB_SAVE_ERROR = -2; + const DB_READ_ERROR = -3; + const CACHE_SAVE_ERROR = -4; + const CACHE_READ_ERROR = -5; + const FILE_SAVE_ERROR = -6; + const LOGIN_ERROR = -7; + const NOT_EXISTS = -8; + const JSON_PARSE_FAIL = -9; + const TYPE_ERROR = -10; + const NUMBER_MATCH_ERROR = -11; + const EMPTY_PARAMS = -12; + const DATA_EXISTS = -13; + const AUTH_ERROR = -14; + + const OTHER_LOGIN = -16; + const VERSION_INVALID = -17; + + const CURL_ERROR = -18; + + const PARAM_INVALID = -995; + const ACCESS_TOKEN_TIMEOUT = -996; + const SESSION_TIMEOUT = -997; + const UNKNOWN = -998; + const EXCEPTION = -999; + + static public function getConstants() { + $oClass = new \ReflectionClass(__CLASS__); + return $oClass->getConstants(); + } + +} \ No newline at end of file diff --git a/extend/StrOrg.php b/Application/Home/ORG/Str.class.php similarity index 61% rename from extend/StrOrg.php rename to Application/Home/ORG/Str.class.php index b3ab2b6..3bd66ae 100644 --- a/extend/StrOrg.php +++ b/Application/Home/ORG/Str.class.php @@ -1,27 +1,31 @@ <?php -/** - * @since 2016-11-04 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - - -class StrOrg { +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2009 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Home\ORG; +class Str { /** * 生成UUID 单机使用 * @access public * @return string */ - static public function uuid() { + static public function uuid() { $charId = md5(uniqid(mt_rand(), true)); $hyphen = chr(45); $uuid = chr(123) - .substr($charId, 0, 8).$hyphen - .substr($charId, 8, 4).$hyphen - .substr($charId,12, 4).$hyphen - .substr($charId,16, 4).$hyphen - .substr($charId,20,12) - .chr(125); + .substr($charId, 0, 8).$hyphen + .substr($charId, 8, 4).$hyphen + .substr($charId, 12, 4).$hyphen + .substr($charId, 16, 4).$hyphen + .substr($charId, 20, 12) + .chr(125); return $uuid; } @@ -33,18 +37,46 @@ class StrOrg { return str_replace('-','',substr(self::uuid(),1,-1)); } + /** + * 检查字符串是否是UTF8编码 + * @param string $string 字符串 + * @return Boolean + */ + static public function isUtf8($string) { + $len=strlen($string); + for($i=0; $i<$len; $i++){ + $c=ord($string[$i]); + if($c > 128){ + if(($c >= 254)) return false; + elseif($c >= 252) $bits=6; + elseif($c >= 248) $bits=5; + elseif($c >= 240) $bits=4; + elseif($c >= 224) $bits=3; + elseif($c >= 192) $bits=2; + else return false; + if(($i+$bits) > $len) return false; + while($bits > 1){ + $i++; + $b=ord($string[$i]); + if($b < 128 || $b > 191) return false; + $bits--; + } + } + } + return true; + } + /** * 字符串截取,支持中文和其他编码 - * @static * @access public * @param string $str 需要转换的字符串 - * @param int $start 开始位置 + * @param integer $start 开始位置 * @param string $length 截取长度 * @param string $charset 编码格式 * @param bool $suffix 截断显示字符 * @return string */ - static public function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) { + static public function mSubStr($str, $start=0, $length, $charset="utf-8", $suffix=true) { if(function_exists("mb_substr")) $slice = mb_substr($str, $start, $length, $charset); elseif(function_exists('iconv_substr')) { @@ -61,9 +93,11 @@ class StrOrg { } /** - * 产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合 支持中文 - * @param int $len 长度 - * @param string $type 字串类型 0 字母 1 数字 其它 混合 + * 产生随机字串,可用来自动生成密码 + * 默认长度6位 字母和数字混合 支持中文 + * @param integer $len 长度 + * @param string $type 字串类型 + * 0 字母 1 数字 其它 混合 * @param string $addChars 额外字符 * @return string */ @@ -90,8 +124,7 @@ class StrOrg { $chars='ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'.$addChars; break; } - if($len>10 ) { - //位数过长重复字符串一定次数 + if($len>10 ) {//位数过长重复字符串一定次数 $chars= $type==1? str_repeat($chars,$len) : str_repeat($chars,5); } if($type!=4) { @@ -100,7 +133,7 @@ class StrOrg { }else{ // 中文随机字 for($i=0;$i<$len;$i++){ - $str.= self::msubstr($chars, floor(mt_rand(0,mb_strlen($chars,'utf-8')-1)),1,'utf-8',false); + $str.= self::msubstr($chars, floor(mt_rand(0,mb_strlen($chars,'utf-8')-1)),1,'utf-8',false); } } return $str; @@ -110,61 +143,64 @@ class StrOrg { * 生成一定数量的随机数,并且不重复 * @param integer $number 数量 * @param integer $length 长度 - * @param integer $mode 字串类型 0 字母 1 数字 其它 混合 + * @param integer $mode 字串类型 + * 0 字母 1 数字 其它 混合 * @return string */ - static public function buildCountRand ($number,$length=4,$mode=1) { - if($mode==1 && $length<strlen($number) ) { - return false; - } - $rand = array(); - for($i=0; $i<$number; $i++) { - $rand[] = self::randString($length,$mode); - } - $unique = array_unique($rand); - if(count($unique)==count($rand)) { + static public function buildCountRand ($number, $length=4, $mode=1) { + if($mode==1 && $length<strlen($number) ) { + //不足以生成一定数量的不重复数字 + return false; + } + $rand = array(); + for($i=0; $i<$number; $i++) { + $rand[] = self::randString($length,$mode); + } + $unique = array_unique($rand); + if(count($unique) == count($rand)) { + return $rand; + } + $count = count($rand) - count($unique); + for($i=0; $i<$count*3; $i++) { + $rand[] = self::randString($length,$mode); + } + $rand = array_slice(array_unique ($rand),0,$number); return $rand; - } - $count = count($rand)-count($unique); - for($i=0; $i<$count*3; $i++) { - $rand[] = self::randString($length,$mode); - } - $rand = array_slice(array_unique ($rand),0,$number); - return $rand; } /** - * 带格式生成随机字符 支持批量生成 - * 但可能存在重复 - * @param string $format 字符格式 # 表示数字 * 表示字母和数字 $ 表示字母 + * 带格式生成随机字符 支持批量生成 + * 但可能存在重复 + * @param string $format 字符格式 + * # 表示数字 * 表示字母和数字 $ 表示字母 * @param integer $number 生成数量 - * @return array + * @return string | array */ static public function buildFormatRand($format,$number=1) { - $str = []; - $length = strlen($format); + $str = array(); + $length = strlen($format); for($j=0; $j<$number; $j++) { - $strTemp = ''; + $strTemp = ''; for($i=0; $i<$length; $i++) { - $char = $format[$i]; + $char = substr($format,$i,1); switch($char){ - case "*": - $strTemp .= self::randString(1); + case "*"://字母和数字混合 + $strTemp .= self::randString(1); break; - case "#": - $strTemp .= self::randString(1,1); + case "#"://数字 + $strTemp .= self::randString(1,1); break; - case "$": - $strTemp .= self::randString(1,2); + case "$"://大写字母 + $strTemp .= self::randString(1,2); break; - default: - $strTemp .= $char; + default://其他格式均不转换 + $strTemp .= $char; break; - } + } } $str[] = $strTemp; } - return $str; + return $number==1? $strTemp : $str ; } /** @@ -177,4 +213,33 @@ class StrOrg { return sprintf("%0".strlen($max)."d", mt_rand($min,$max)); } + // 自动转换字符集 支持数组转换 + static public function autoCharset($string, $from='gbk', $to='utf-8') { + $from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from; + $to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to; + if (strtoupper($from) === strtoupper($to) || empty($string) || (is_scalar($string) && !is_string($string))) { + //如果编码相同或者非字符串标量则不转换 + return $string; + } + if (is_string($string)) { + if (function_exists('mb_convert_encoding')) { + return mb_convert_encoding($string, $to, $from); + } elseif (function_exists('iconv')) { + return iconv($from, $to, $string); + } else { + return $string; + } + } elseif (is_array($string)) { + foreach ($string as $key => $val) { + $_key = self::autoCharset($key, $from, $to); + $string[$_key] = self::autoCharset($val, $from, $to); + if ($key != $_key) + unset($string[$key]); + } + return $string; + } + else { + return $string; + } + } } \ No newline at end of file diff --git a/Application/Home/View/Wiki/apiField.html b/Application/Home/View/Wiki/apiField.html new file mode 100644 index 0000000..1653aae --- /dev/null +++ b/Application/Home/View/Wiki/apiField.html @@ -0,0 +1,153 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>{$apiInfo['apiName']} - 在线接口文档</title> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.css"> + <script src="//cdn.bootcss.com/jquery/3.2.0/jquery.min.js"></script> + <script src="//cdn.bootcss.com/semantic-ui/2.1.6/components/tab.js"></script> + <link rel="stylesheet" href="__PUBLIC__/jsonFormater/jsonFormater.css"> + <script type="text/javascript" src="__PUBLIC__/jsonFormater/jsonFormater.js"></script> +</head> +<body> +<br /> +<div class="ui text container" style="max-width: none !important;"> + <div class="ui floating message"> + <h2 class='ui header'>接口唯一标识:<a target="_blank" href="http://{$_SERVER['HTTP_HOST']}/api/{$apiInfo['hash']}">{$apiInfo['hash']}</a>({$apiInfo['apiName']})</h2><br /> + <switch name="apiInfo['method']" > + <case value="1" break="1"> <span class='ui orange tag label'>POST</span></case> + <case value="2" break="1"> <span class='ui blue tag label'>GET</span></case> + <default /> <span class='ui teal tag label'>不限</span> + </switch> + <span class='ui orange tag label'>{:C('APP_VERSION')}</span> + <div class="ui raised segment"> + <span class="ui red ribbon label">接口说明</span> + <div class="ui message"> + <p>{$apiInfo['info']}</p> + </div> + </div> + <div class="ui pointing large blue three item menu"> + <a class="item active" data-tab="first">请求参数</a> + <a class="item" data-tab="second">返回参数</a> + <a class="item" data-tab="third">返回示例</a> + </div> + <div class="ui tab segment active" data-tab="first" style="max-height: 500px;overflow: auto;"> + <h3>公共请求参数</h3> + <table class="ui orange celled striped table" > + <thead> + <tr><th>参数名字</th><th>类型</th><th>是否必须</th><th>默认值</th><th>其他</th><th>说明</th></tr> + </thead> + <tbody> + <tr> + <td>version</td> + <td>String</td> + <td><span class="ui green label">必填</span></td> + <td>{:C('APP_VERSION')}</td> + <td></td> + <td>API版本号【请在Header头里面传递】</td> + </tr> + <tr> + <td>access-token</td> + <td>String</td> + <td>{$apiInfo['accessToken']==1?'<span class="ui green label">必填</span>':'<span class="ui red label">勿填</span>'}</td> + <td></td> + <td></td> + <td>APP认证秘钥【请在Header头里面传递】</td> + </tr> + <tr> + <td>user-token</td> + <td>String</td> + <td>{$apiInfo['needLogin']==1?'<span class="ui green label">必填</span>':'<span class="ui red label">勿填</span>'}</td> + <td></td> + <td></td> + <td>用户认证秘钥【请在Header头里面传递】</td> + </tr> + </tbody> + </table> + <h3>请求参数</h3> + <table class="ui red celled striped table" > + <thead> + <tr><th>参数名字</th><th>类型</th><th>是否必须</th><th>默认值</th><th>其他</th><th>说明</th></tr> + </thead> + <tbody> + <volist name="request" id="vo"> + <tr> + <td>{$vo['fieldName']}</td> + <td>{$dataType[$vo['dataType']]}</td> + <td>{$vo['isMust']==1?'<span class="ui green label">必填</span>':'<span class="ui teal label">可选</span>'}</td> + <td>{$vo['default']}</td> + <td>{$vo['range']}</td> + <td>{$vo['info']}</td> + </tr> + </volist> + </tbody> + </table> + </div> + <div class="ui tab segment" data-tab="second" style="max-height: 500px;overflow: auto;"> + <h3>公共返回参数</h3> + <table class="ui olive celled striped table" > + <thead> + <tr><th>返回字段</th><th>类型</th><th>说明</th></tr> + </thead> + <tbody> + <tr> + <td>code</td> + <td>Integer</td> + <td>返回码,详情请参阅<a href="{:U('/errorList')}">错误码说明</a></td> + </tr> + <tr> + <td>msg</td> + <td>String</td> + <td>错误描述,当请求成功时可能为空</td> + </tr> + <tr> + <td>debug</td> + <td>String</td> + <td>调试字段,如果没有调试信息会没有此字段</td> + </tr> + </tbody> + </table> + <h3>返回参数</h3> + <table class="ui green celled striped table" > + <thead> + <tr><th>返回字段</th><th>类型</th><th>说明</th></tr> + </thead> + <tbody> + <volist name="response" id="vo"> + <tr> + <td>{$vo['showName']}</td> + <td>{$dataType[$vo['dataType']]}</td> + <td>{$vo['info']}</td> + </tr> + </volist> + </tbody> + </table> + </div> + <div class="ui tab segment" data-tab="third" style="max-height: 500px;overflow: auto;"> + <pre id="json" style='font-family: Arial;'></pre> + </div> + <div class="ui blue message"> + <strong>温馨提示:</strong> 此接口参数列表根据后台代码自动生成,如有疑问请咨询后端开发 + </div> + <p>© Powered By <a href="">{:C('APP_NAME')} {:C('APP_VERSION')}</a> <p> + </div> +</div> +<script> + $('.pointing.menu .item').tab(); + $(document).ready(function () { + var s = function () { + var options = { + dom: '#json', + isCollapsible: true, + quoteKeys: true, + tabSize: 2, + imgCollapsed: "__PUBLIC__/images/jsonFormater/Collapsed.gif", + imgExpanded: "__PUBLIC__/images/jsonFormater/Expanded.gif" + }; + window.jf = new JsonFormater(options); + jf.doFormat({$apiInfo['returnStr']}); + }(); + }); +</script> +</body> +</html> \ No newline at end of file diff --git a/Application/Home/View/Wiki/apiList.html b/Application/Home/View/Wiki/apiList.html new file mode 100644 index 0000000..47cf1dd --- /dev/null +++ b/Application/Home/View/Wiki/apiList.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>{:MODULE_NAME} - 在线接口列表</title> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.css"> +</head> +<body> +<br /> +<div class="ui text container" style="max-width: none !important;"> + <div class="ui floating message"> + <h1 class="ui header">接口列表 {:C('APP_VERSION')}</h1> + <a href="{:U('/errorList')}"> + <button class="ui red button" style="margin-top: 15px">错误码说明</button> + </a> + <a href="{:U('/calculation')}"> + <button class="ui orange button" style="margin-top: 15px">算法详解</button> + </a> + <div class="ui teal message"> + <strong>API统一访问地址:</strong> http://{$_SERVER['HTTP_HOST']}/api/接口唯一标识 + </div> + <div class="ui floating message"> + <div class="content"> + <div class="header" style="margin-bottom: 15px">接口状态说明:</div> + <p><span class='ui teal label'>测试</span> 系统将不过滤任何字段,也不进行AccessToken的认证,但在必要的情况下会进行UserToken的认证!</p> + <p><span class='ui blue label'>启用</span> 系统将严格过滤请求字段,并且进行全部必要认证!</p> + <p><span class='ui red label'>禁用</span> 系统将拒绝所有请求,一般应用于危机处理!</p> + </div> + </div> + <table class="ui green celled striped table"> + <thead> + <tr> + <th>#</th><th>请求方法</th><th>接口唯一标识</th><th>接口状态</th><th>真实类库</th><th width="40%">接口说明</th> + </tr> + </thead> + <tbody> + <volist name="list" id="vo"> + <tr> + <td>{$i}</td> + <td> + <switch name="vo['method']" > + <case value="1" break="1"> <span class='ui orange label'>POST</span></case> + <case value="2" break="1"> <span class='ui blue label'>GET</span></case> + <default /> <span class='ui teal label'>不限</span> + </switch> + </td> + <td><a target="_blank" href="{:U('/wiki/'.$vo['hash'])}">{$vo['hash']}</a></td> + <td> + <if condition="$vo['status'] eq 0 "> + <span class='ui red label'>禁用</span> + <else /> + <if condition="$vo['isTest'] eq 1 "> + <span class='ui teal label'>测试</span> + <else /> + <span class='ui blue label'>启用</span> + </if> + </if> + </td> + <td>{$vo['apiName']}</td> + <td>{$vo['info']}</td> + </tr> + </volist> + </tbody> + </table> + <p>© Powered By <a href="">{:C('APP_NAME')} {:C('APP_VERSION')}</a> <p> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/Application/Home/View/Wiki/calculation.html b/Application/Home/View/Wiki/calculation.html new file mode 100644 index 0000000..d4f1563 --- /dev/null +++ b/Application/Home/View/Wiki/calculation.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>{:MODULE_NAME} - 算法说明</title> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.css"> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/components/table.min.css"> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/components/container.min.css"> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/components/message.min.css"> +</head> +<body> +<br /> +<div class="ui text container" style="max-width: none !important;"> + <div class="ui floating message"> + <h1 class="ui header">算法说明 {:C('APP_VERSION')}</h1> + <a href="{:U('/wikiList')}"> + <button class="ui green button" style="margin-top: 15px">返回接口列表</button> + </a> + <div class="ui red message"> + <strong>特别说明:</strong> 此算法文档会根据业务发展需求发生变更,为了服务的稳定运行,请及时关注此文档! + </div> + <div class="ui piled segment"> + <div class="ui horizontal divider">简介</div> + <p>当前算法主要服务于获取身份令牌(AccessToken)所进行的身份认证秘钥的计算。在请求高级接口的时候,系统会验证应用的合法性,也就是验证AccessToken。所以AccessToken是请求API的必要参数。</p> + <p>在请求获取AccessToken的接口时候,服务器会对用户合法性进行核验,具体的接口请求字段,请参看具体的接口文档。</p> + <div class="ui horizontal divider">一、获取app_id和app_secret</div> + <p>目前获取应用ID和应用秘钥是人工手动发放,请联系后台开发。<b>请注意:app_secret非常重要请妥善保管</b></p> + <div class="ui horizontal divider">二、准备加密对象,并且根据字段名降序排序</div> +<pre>//排序好后应当是如下所示的数据 +{ + "app_id":"服务器颁发的应用ID", + "app_secret":"服务器颁发的应用秘钥", //请注意,此字段只是在计算加密串的时候在被加入,API请求请勿传递此字段值 + "device_id":"设备唯一ID", + "rand_str":"随机字符串", + "timestamp":当前系统时间戳 +}</pre> + <div class="ui horizontal divider">三、生成原始串</div> + <p>将上面的数据构建成HTTP查询字符串,如下所示:</p> + <p>app_id=服务器颁发的应用ID&app_secret=服务器颁发的应用秘钥&device_id=设备唯一ID&rand_str=随机字符串&timestamp=当前系统时间戳</p> + <div class="ui horizontal divider">四、计算秘钥</div> + <p>将第三步生成的字符串进行哈希计算(md5)获得最终身份认证秘钥。</p> + </div> + <p>© Powered By <a href="">{:C('APP_NAME')} {:C('APP_VERSION')}</a> <p> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/Application/Home/View/Wiki/errorCode.html b/Application/Home/View/Wiki/errorCode.html new file mode 100644 index 0000000..91fe3e9 --- /dev/null +++ b/Application/Home/View/Wiki/errorCode.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>{:MODULE_NAME} - 错误码说明</title> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/semantic.min.css"> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/components/table.min.css"> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/components/container.min.css"> + <link rel="stylesheet" href="https://staticfile.qnssl.com/semantic-ui/2.1.6/components/message.min.css"> +</head> +<body> +<br /> +<div class="ui text container" style="max-width: none !important;"> + <div class="ui floating message"> + <h1 class="ui header">错误码说明 {:C('APP_VERSION')}</h1> + <a href="{:U('/wikiList')}"> + <button class="ui green button" style="margin-top: 15px">返回接口列表</button> + </a> + <table class="ui red celled striped table"> + <thead> + <tr> + <th>#</th><th>英文标识</th><th>错误码</th><th>中文说明</th> + </tr> + </thead> + <tbody> + <volist name="codeArr" id="vo"> + <tr> + <td> + {$i} + </td> + <td> + {$key} + </td> + <td> + <b>{$vo}</b> + </td> + <td> + {$errorInfo[$vo]} + </td> + </tr> + </volist> + </tbody> + </table> + <p>© Powered By <a href="">{:C('APP_NAME')} {:C('APP_VERSION')}</a> <p> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/Application/Home/View/index.html b/Application/Home/View/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Home/View/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/Home/index.html b/Application/Home/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/Home/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Application/index.html b/Application/index.html new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/Application/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 55e3a19..0000000 --- a/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "{}" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright 2016 Zhao - - 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. \ No newline at end of file diff --git a/Public/css/dataTable.css b/Public/css/dataTable.css new file mode 100644 index 0000000..0221bef --- /dev/null +++ b/Public/css/dataTable.css @@ -0,0 +1,74 @@ +.dataTables_length, .dataTables_filter, .dataTables_info, .dataTables_paginate { + margin-bottom: 10px; + display: inline-block; +} + +.dataTables_length, .dataTables_info { + float: left; +} + +.dataTables_filter, .dataTables_paginate { + float: right; +} + +.dataTables_length select, .dataTables_filter input[type=search] { + width: 100px; + height: 30px; + border: 1px solid #ccc; + padding: 0 5px; + display: inline-block; +} + +.dataTables_paginate span, .dataTables_paginate a.paginate_button { + border-radius: 2px; + cursor: pointer; +} + +.dataTables_paginate a,.dataTables_paginate>span>span{ + box-sizing: border-box; + display: inline-block; + min-width: 2em; + height: 30px; + line-height: 28px; + border: 1px solid transparent; + padding: 0 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none; + cursor: pointer; +} + +.dataTables_paginate span a.current, .dataTables_paginate a.paginate_button:hover { + color: white; + background: #009688; +} + +.dataTables_length select { + width: 60px; + border-radius: 2px; +} + +table.dataTable tbody tr.even { + background: #f2f2f2; +} + +table.dataTable tbody tr.selected { + background: #eeeeee; +} + +table.dataTable thead .sorting_asc{ + background-image: url("../images/sort_asc.png"); +} + +table.dataTable thead .sorting_desc{ + background-image: url("../images/sort_desc.png"); +} + +table.dataTable thead .sorting{ + background-image: url("../images/sort_both.png"); +} + +table.dataTable thead .sorting,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc{ + background-repeat: no-repeat; + background-position: center right; +} \ No newline at end of file diff --git a/Public/dataTable/jquery.dataTables.min.js b/Public/dataTable/jquery.dataTables.min.js new file mode 100644 index 0000000..435af7c --- /dev/null +++ b/Public/dataTable/jquery.dataTables.min.js @@ -0,0 +1,152 @@ +/*! DataTables 1.10.0 + * ©2008-2014 SpryMedia Ltd - datatables.net/license + */ +(function(za,N,l){var M=function(g){function S(a){var b,c,d={};g.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),d[c]=e,"o"===b[1]&&S(a[e])});a._hungarianMap=d}function G(a,b,c){a._hungarianMap||S(a);var d;g.each(b,function(e){d=a._hungarianMap[e];if(d!==l&&(c||b[d]===l))"o"===d.charAt(0)?(b[d]||(b[d]={}),g.extend(!0,b[d],b[e]),G(a[d],b[d],c)):b[d]=b[e]})}function M(a){var b=p.defaults.oLanguage,c=a.sZeroRecords; +!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&D(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&D(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&bb(a)}function cb(a){w(a,"ordering","bSort");w(a,"orderMulti","bSortMulti");w(a,"orderClasses","bSortClasses");w(a,"orderCellsTop","bSortCellsTop");w(a,"order","aaSorting");w(a,"orderFixed","aaSortingFixed");w(a,"paging","bPaginate"); +w(a,"pagingType","sPaginationType");w(a,"pageLength","iDisplayLength");w(a,"searching","bFilter")}function db(a){w(a,"orderable","bSortable");w(a,"orderData","aDataSort");w(a,"orderSequence","asSorting");w(a,"orderDataType","sortDataType")}function eb(a){var a=a.oBrowser,b=g("<div/>").css({position:"absolute",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(g("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(g('<div class="test"/>').css({width:"100%",height:10}))).appendTo("body"), +c=b.find(".test");a.bScrollOversize=100===c[0].offsetWidth;a.bScrollbarLeft=1!==c.offset().left;b.remove()}function fb(a,b,c,d,e,f){var h,i=!1;c!==l&&(h=c,i=!0);for(;d!==e;)a.hasOwnProperty(d)&&(h=i?b(h,a[d],d,a):a[d],i=!0,d+=f);return h}function Aa(a,b){var c=p.defaults.column,d=a.aoColumns.length,c=g.extend({},p.models.oColumn,c,{nTh:b?b:N.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols; +c[d]=g.extend({},p.models.oSearch,c[d]);fa(a,d,null)}function fa(a,b,c){var d=a.aoColumns[b],b=a.oClasses,e=g(d.nTh);if(!d.sWidthOrig){d.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%])/);f&&(d.sWidthOrig=f[1])}c!==l&&null!==c&&(db(c),G(p.defaults.column,c),c.mDataProp!==l&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(d._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),g.extend(d,c),D(d,c,"sWidth","sWidthOrig"),"number"===typeof c.iDataSort&& +(d.aDataSort=[c.iDataSort]),D(d,c,"aDataSort"));var c=d.mData,h=T(c),i=d.mRender?T(d.mRender):null,f=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};d._bAttrSrc=g.isPlainObject(c)&&(f(c.sort)||f(c.type)||f(c.filter));d.fnGetData=function(a,b){var c=h(a,b);return d.mRender&&b&&""!==b?i(c,b,a):c};d.fnSetData=Ba(c);a.oFeatures.bSort||(d.bSortable=!1,e.addClass(b.sSortableNone));a=-1!==g.inArray("asc",d.asSorting);e=-1!==g.inArray("desc",d.asSorting);!d.bSortable||!a&&!e?(d.sSortingClass= +b.sSortableNone,d.sSortingClassJUI=""):a&&!e?(d.sSortingClass=b.sSortableAsc,d.sSortingClassJUI=b.sSortJUIAscAllowed):!a&&e?(d.sSortingClass=b.sSortableDesc,d.sSortingClassJUI=b.sSortJUIDescAllowed):(d.sSortingClass=b.sSortable,d.sSortingClassJUI=b.sSortJUI)}function U(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ca(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&V(a);t(a,null,"column-sizing",[a])}function ga(a,b){var c=W(a,"bVisible"); +return"number"===typeof c[b]?c[b]:null}function X(a,b){var c=W(a,"bVisible"),c=g.inArray(b,c);return-1!==c?c:null}function Y(a){return W(a,"bVisible").length}function W(a,b){var c=[];g.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Da(a){var b=a.aoColumns,c=a.aoData,d=p.ext.type.detect,e,f,h,i,j,g,m,o,k;e=0;for(f=b.length;e<f;e++)if(m=b[e],k=[],!m.sType&&m._sManualType)m.sType=m._sManualType;else if(!m.sType){h=0;for(i=d.length;h<i;h++){j=0;for(g=c.length;j<g&&!(k[j]===l&&(k[j]= +A(a,j,e,"type")),o=d[h](k[j],a),!o||"html"===o);j++);if(o){m.sType=o;break}}m.sType||(m.sType="string")}}function gb(a,b,c,d){var e,f,h,i,j,n,m=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var o=n.targets!==l?n.targets:n.aTargets;g.isArray(o)||(o=[o]);f=0;for(h=o.length;f<h;f++)if("number"===typeof o[f]&&0<=o[f]){for(;m.length<=o[f];)Aa(a);d(o[f],n)}else if("number"===typeof o[f]&&0>o[f])d(m.length+o[f],n);else if("string"===typeof o[f]){i=0;for(j=m.length;i<j;i++)("_all"==o[f]||g(m[i].nTh).hasClass(o[f]))&& +d(i,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function H(a,b,c,d){var e=a.aoData.length,f=g.extend(!0,{},p.models.oRow,{src:c?"dom":"data"});f._aData=b;a.aoData.push(f);for(var b=a.aoColumns,f=0,h=b.length;f<h;f++)c&&Ea(a,e,f,A(a,e,f)),b[f].sType=null;a.aiDisplayMaster.push(e);a.oFeatures.bDeferRender||Fa(a,e,c,d);return e}function ha(a,b){var c;b instanceof g||(b=g(b));return b.map(function(b,e){c=ia(a,e);return H(a,c.data,e,c.cells)})}function A(a,b,c,d){var c=a.aoColumns[c],e=a.aoData[b]._aData, +f=c.fnGetData(e,d);if(f===l)return a.iDrawError!=a.iDraw&&null===c.sDefaultContent&&(O(a,0,"Requested unknown parameter "+("function"==typeof c.mData?"{function}":"'"+c.mData+"'")+" for row "+b,4),a.iDrawError=a.iDraw),c.sDefaultContent;if((f===e||null===f)&&null!==c.sDefaultContent)f=c.sDefaultContent;else if("function"===typeof f)return f();return null===f&&"display"==d?"":f}function Ea(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d)}function Ga(a){return g.map(a.match(/(\\.|[^\.])+/g), +function(a){return a.replace("\\.",".")})}function T(a){if(g.isPlainObject(a)){var b={};g.each(a,function(a,c){c&&(b[a]=T(c))});return function(a,c,f){var h=b[c]||b._;return h!==l?h(a,c,f):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f){return a(b,c,f)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var h,i;if(""!==f){i=Ga(f);for(var j=0,g=i.length;j<g;j++){f=i[j].match(Z);h=i[j].match(P);if(f){i[j]= +i[j].replace(Z,"");""!==i[j]&&(a=a[i[j]]);h=[];i.splice(0,j+1);i=i.join(".");j=0;for(g=a.length;j<g;j++)h.push(c(a[j],b,i));a=f[0].substring(1,f[0].length-1);a=""===a?h:h.join(a);break}else if(h){i[j]=i[j].replace(P,"");a=a[i[j]]();continue}if(null===a||a[i[j]]===l)return l;a=a[i[j]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function Ba(a){if(g.isPlainObject(a))return Ba(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,d){a(b,"set", +d)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=Ga(e),f;f=e[e.length-1];for(var h,i,j=0,g=e.length-1;j<g;j++){h=e[j].match(Z);i=e[j].match(P);if(h){e[j]=e[j].replace(Z,"");a[e[j]]=[];f=e.slice();f.splice(0,j+1);h=f.join(".");i=0;for(g=d.length;i<g;i++)f={},b(f,d[i],h),a[e[j]].push(f);return}i&&(e[j]=e[j].replace(P,""),a=a[e[j]](d));if(null===a[e[j]]||a[e[j]]===l)a[e[j]]={};a=a[e[j]]}if(f.match(P))a[f.replace(P,"")](d);else a[f.replace(Z, +"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ha(a){return B(a.aoData,"_aData")}function ja(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0}function ka(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===l&&a.splice(d,1)}function la(a,b,c,d){var e=a.aoData[b],f;if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=ia(a,e).data;else{var h=e.anCells;if(h){c=0;for(f=h.length;c<f;c++)h[c].innerHTML=A(a,b,c,"display")}}e._aSortData= +null;e._aFilterData=null;a=a.aoColumns;if(d!==l)a[d].sType=null;else{c=0;for(f=a.length;c<f;c++)a[c].sType=null}Ia(e)}function ia(a,b){var c=[],d=[],e=b.firstChild,f,h,i,j=0,n,m=a.aoColumns,o=function(a,b,c){"string"===typeof a&&(b=a.indexOf("@"),-1!==b&&(a=a.substring(b+1),i["@"+a]=c.getAttribute(a)))},k=function(a){h=m[j];n=g.trim(a.innerHTML);h&&h._bAttrSrc?(i={display:n},o(h.mData.sort,i,a),o(h.mData.type,i,a),o(h.mData.filter,i,a),c.push(i)):c.push(n);d.push(a);j++};if(e)for(;e;)f=e.nodeName.toUpperCase(), +("TD"==f||"TH"==f)&&k(e),e=e.nextSibling;else{d=b.anCells;e=0;for(f=d.length;e<f;e++)k(d[e])}return{data:c,cells:d}}function Fa(a,b,c,d){var e=a.aoData[b],f=e._aData,h=[],i,j,g,m,o;if(null===e.nTr){i=c||N.createElement("tr");e.nTr=i;e.anCells=h;i._DT_RowIndex=b;Ia(e);m=0;for(o=a.aoColumns.length;m<o;m++){g=a.aoColumns[m];j=c?d[m]:N.createElement(g.sCellType);h.push(j);if(!c||g.mRender||g.mData!==m)j.innerHTML=A(a,b,m,"display");g.sClass&&(j.className+=" "+g.sClass);g.bVisible&&!c?i.appendChild(j): +!g.bVisible&&c&&j.parentNode.removeChild(j);g.fnCreatedCell&&g.fnCreatedCell.call(a.oInstance,j,A(a,b,m,"display"),f,b,m)}t(a,"aoRowCreatedCallback",null,[i,f,b])}e.nTr.setAttribute("role","row")}function Ia(a){var b=a.nTr,c=a._aData;if(b){c.DT_RowId&&(b.id=c.DT_RowId);if(c.DT_RowClass){var d=c.DT_RowClass.split(" ");a.__rowc=a.__rowc?Ja(a.__rowc.concat(d)):d;g(b).removeClass(a.__rowc.join(" ")).addClass(c.DT_RowClass)}c.DT_RowData&&g(b).data(c.DT_RowData)}}function hb(a){var b,c,d,e,f,h=a.nTHead, +i=a.nTFoot,j=0===g("th, td",h).length,n=a.oClasses,m=a.aoColumns;j&&(e=g("<tr/>").appendTo(h));b=0;for(c=m.length;b<c;b++)f=m[b],d=g(f.nTh).addClass(f.sClass),j&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Ka(a,f.nTh,b))),f.sTitle!=d.html()&&d.html(f.sTitle),La(a,"header")(a,d,f,n);j&&$(a.aoHeader,h);g(h).find(">tr").attr("role","row");g(h).find(">tr>th, >tr>td").addClass(n.sHeaderTH);g(i).find(">tr>th, >tr>td").addClass(n.sFooterTH); +if(null!==i){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=m[b],f.nTf=a[b].cell,f.sClass&&g(f.nTf).addClass(f.sClass)}}function I(a,b,c){var d,e,f,h=[],i=[],j=a.aoColumns.length,n;if(b){c===l&&(c=!1);d=0;for(e=b.length;d<e;d++){h[d]=b[d].slice();h[d].nTr=b[d].nTr;for(f=j-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&h[d].splice(f,1);i.push([])}d=0;for(e=h.length;d<e;d++){if(a=h[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=h[d].length;f<b;f++)if(n=j=1,i[d][f]===l){a.appendChild(h[d][f].cell);for(i[d][f]= +1;h[d+j]!==l&&h[d][f].cell==h[d+j][f].cell;)i[d+j][f]=1,j++;for(;h[d][f+n]!==l&&h[d][f].cell==h[d][f+n].cell;){for(c=0;c<j;c++)i[d+c][f+n]=1;n++}g(h[d][f].cell).attr("rowspan",j).attr("colspan",n)}}}}function J(a){var b=t(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==g.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,h=a.iInitDisplayStart,i="ssp"==z(a),j=a.aiDisplay;a.bDrawing=!0;h!==l&&-1!==h&&(a._iDisplayStart=i?h:h>=a.fnRecordsDisplay()?0:h,a.iInitDisplayStart= +-1);var h=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(i){if(!a.bDestroying&&!ib(a))return}else a.iDraw++;if(0!==j.length){f=i?a.aoData.length:n;for(i=i?0:h;i<f;i++){var m=j[i],o=a.aoData[m];null===o.nTr&&Fa(a,m);m=o.nTr;if(0!==e){var k=d[c%e];o._sRowStripe!=k&&(g(m).removeClass(o._sRowStripe).addClass(k),o._sRowStripe=k)}t(a,"aoRowCallback",null,[m,o._aData,c,i]);b.push(m);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==z(a)?c=f.sLoadingRecords: +f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=g("<tr/>",{"class":e?d[0]:""}).append(g("<td />",{valign:"top",colSpan:Y(a),"class":a.oClasses.sRowEmpty}).html(c))[0];t(a,"aoHeaderCallback","header",[g(a.nTHead).children("tr")[0],Ha(a),h,n,j]);t(a,"aoFooterCallback","footer",[g(a.nTFoot).children("tr")[0],Ha(a),h,n,j]);d=g(a.nTBody);d.children().detach();d.append(g(b));t(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function K(a,b){var c=a.oFeatures,d=c.bFilter; +c.bSort&&jb(a);d?aa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);J(a)}function kb(a){var b=a.oClasses,c=g(a.nTable),c=g("<div/>").insertBefore(c),d=a.oFeatures,e=g("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),h,i,j,n,m,o,k=0;k<f.length;k++){h=null;i=f[k];if("<"==i){j=g("<div/>")[0];n=f[k+1];if("'"==n||'"'==n){m= +"";for(o=2;f[k+o]!=n;)m+=f[k+o],o++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),j.id=n[0].substr(1,n[0].length-1),j.className=n[1]):"#"==m.charAt(0)?j.id=m.substr(1,m.length-1):j.className=m;k+=o}e.append(j);e=g(j)}else if(">"==i)e=e.parent();else if("l"==i&&d.bPaginate&&d.bLengthChange)h=lb(a);else if("f"==i&&d.bFilter)h=mb(a);else if("r"==i&&d.bProcessing)h=nb(a);else if("t"==i)h=ob(a);else if("i"==i&&d.bInfo)h=pb(a);else if("p"==i&&d.bPaginate)h=qb(a);else if(0!== +p.ext.feature.length){j=p.ext.feature;o=0;for(n=j.length;o<n;o++)if(i==j[o].cFeature){h=j[o].fnInit(a);break}}h&&(j=a.aanFeatures,j[i]||(j[i]=[]),j[i].push(h),e.append(h))}c.replaceWith(e)}function $(a,b){var c=g(b).children("tr"),d,e,f,h,i,j,n,m,o,k;a.splice(0,a.length);f=0;for(j=c.length;f<j;f++)a.push([]);f=0;for(j=c.length;f<j;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){m=1*e.getAttribute("colspan");o=1*e.getAttribute("rowspan");m=!m|| +0===m||1===m?1:m;o=!o||0===o||1===o?1:o;h=0;for(i=a[f];i[h];)h++;n=h;k=1===m?!0:!1;for(i=0;i<m;i++)for(h=0;h<o;h++)a[f+h][n+i]={cell:e,unique:k},a[f+h].nTr=d}e=e.nextSibling}}}function ma(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],$(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,h=c[b].length;f<h;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function na(a,b,c){t(a,"aoServerParams","serverParams",[b]);if(b&&g.isArray(b)){var d={},e=/(.*?)\[\]$/;g.each(b,function(a,b){var c= +b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,h=a.ajax,i=a.oInstance;if(g.isPlainObject(h)&&h.data){f=h.data;var j=g.isFunction(f)?f(b):f,b=g.isFunction(f)&&j?j:g.extend(!0,b,j);delete h.data}j={data:b,success:function(b){var d=b.error||b.sError;d&&a.oApi._fnLog(a,0,d);a.json=b;t(a,null,"xhr",[a,b]);c(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=a.oApi._fnLog;"parsererror"==c?d(a,0,"Invalid JSON response",1):4===b.readyState&& +d(a,0,"Ajax error",7);C(a,!1)}};a.oAjaxData=b;t(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(i,a.sAjaxSource,g.map(b,function(a,b){return{name:b,value:a}}),c,a):a.sAjaxSource||"string"===typeof h?a.jqXHR=g.ajax(g.extend(j,{url:h||a.sAjaxSource})):g.isFunction(h)?a.jqXHR=h.call(i,b,c,a):(a.jqXHR=g.ajax(g.extend(j,h)),h.data=f)}function ib(a){if(a.bAjaxDataGet){a.iDraw++;C(a,!0);var b=rb(a);na(a,b,function(b){sb(a,b)},a);return!1}return!0}function rb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures, +e=a.oPreviousSearch,f=a.aoPreSearchCols,h,i=[],j,n,m,o=Q(a);h=a._iDisplayStart;j=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){i.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",B(b,"sName").join(","));k("iDisplayStart",h);k("iDisplayLength",j);var l={draw:a.iDraw,columns:[],order:[],start:h,length:j,search:{value:e.sSearch,regex:e.bRegex}};for(h=0;h<c;h++)n=b[h],m=f[h],j="function"==typeof n.mData?"function":n.mData,l.columns.push({data:j,name:n.sName,searchable:n.bSearchable, +orderable:n.bSortable,search:{value:m.sSearch,regex:m.bRegex}}),k("mDataProp_"+h,j),d.bFilter&&(k("sSearch_"+h,m.sSearch),k("bRegex_"+h,m.bRegex),k("bSearchable_"+h,n.bSearchable)),d.bSort&&k("bSortable_"+h,n.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&(g.each(o,function(a,b){l.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+a,b.dir)}),k("iSortingCols",o.length));b=p.ext.legacy.ajax;return null===b?a.sAjaxSource?i:l:b?i:l}function sb(a,b){var c= +b.sEcho!==l?b.sEcho:b.draw,d=b.iTotalRecords!==l?b.iTotalRecords:b.recordsTotal,e=b.iTotalDisplayRecords!==l?b.iTotalDisplayRecords:b.recordsFiltered;if(c){if(1*c<a.iDraw)return;a.iDraw=1*c}ja(a);a._iRecordsTotal=parseInt(d,10);a._iRecordsDisplay=parseInt(e,10);c=oa(a,b);d=0;for(e=c.length;d<e;d++)H(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;J(a);a._bInitComplete||pa(a,b);a.bAjaxDataGet=!0;C(a,!1)}function oa(a,b){var c=g.isPlainObject(a.ajax)&&a.ajax.dataSrc!==l?a.ajax.dataSrc: +a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?T(c)(b):b}function mb(a){var b=a.oClasses,c=a.sTableId,d=a.oPreviousSearch,e=a.aanFeatures,f='<input type="search" class="input-text '+b.sFilterInput+'"/>',h=a.oLanguage.sSearch,h=h.match(/_INPUT_/)?h.replace("_INPUT_",f):h+f,b=g("<div/>",{id:!e.f?c+"_filter":null,"class":b.sFilter}).append(g("<label/>").append(h)),e=function(){var b=!this.value?"":this.value;b!=d.sSearch&&(aa(a,{sSearch:b,bRegex:d.bRegex,bSmart:d.bSmart,bCaseInsensitive:d.bCaseInsensitive}), +a._iDisplayStart=0,J(a))},i=g("input",b).val(d.sSearch.replace('"',""")).bind("keyup.DT search.DT input.DT paste.DT cut.DT","ssp"===z(a)?Ma(e,400):e).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);g(a.nTable).on("filter.DT",function(){try{i[0]!==N.activeElement&&i.val(d.sSearch)}catch(a){}});return b[0]}function aa(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive}; +Da(a);if("ssp"!=z(a)){tb(a,b.sSearch,c,b.bEscapeRegex!==l?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)ub(a,e[b].sSearch,b,e[b].bEscapeRegex!==l?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);vb(a)}else f(b);a.bFiltered=!0;t(a,null,"search",[a])}function vb(a){for(var b=p.ext.search,c=a.aiDisplay,d,e,f=0,h=b.length;f<h;f++)for(var i=c.length-1;0<=i;i--)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData)||c.splice(i,1)}function ub(a,b,c,d, +e,f){if(""!==b)for(var h=a.aiDisplay,d=Na(b,d,e,f),e=h.length-1;0<=e;e--)b=a.aoData[h[e]]._aFilterData[c],d.test(b)||h.splice(e,1)}function tb(a,b,c,d,e,f){var d=Na(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,h;0!==p.ext.search.length&&(c=!0);h=wb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(h||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Na(a,b,c,d){a=b?a: +Oa(a);c&&(a="^(?=.*?"+g.map(a.match(/"[^"]+"|[^ ]+/g)||"",function(a){return'"'===a.charAt(0)?a.match(/^"(.*)"$/)[1]:a}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function Oa(a){return a.replace(Sb,"\\$1")}function wb(a){var b=a.aoColumns,c,d,e,f,h,i,j,g,m=p.ext.type.search;c=!1;d=0;for(f=a.aoData.length;d<f;d++)if(g=a.aoData[d],!g._aFilterData){i=[];e=0;for(h=b.length;e<h;e++)c=b[e],c.bSearchable?(j=A(a,d,e,"filter"),j=m[c.sType]?m[c.sType](j):null!==j?j:""):j="",j.indexOf&&-1!==j.indexOf("&")&& +(qa.innerHTML=j,j=Tb?qa.textContent:qa.innerText),j.replace&&(j=j.replace(/[\r\n]/g,"")),i.push(j);g._aFilterData=i;g._sFilterRow=i.join(" ");c=!0}return c}function pb(a){var b=a.sTableId,c=a.aanFeatures.i,d=g("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:xb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),g(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function xb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage, +d=a._iDisplayStart+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),h=a.fnRecordsDisplay(),i=h?c.sInfo:c.sInfoEmpty;h!==f&&(i+=" "+c.sInfoFiltered);i+=c.sInfoPostFix;i=yb(a,i);c=c.fnInfoCallback;null!==c&&(i=c.call(a.oInstance,a,d,e,f,h,i));g(b).html(i)}}function yb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),h=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g, +c.call(a,f)).replace(/_PAGE_/g,c.call(a,h?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,h?1:Math.ceil(f/e)))}function ra(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;if(a.bInitialised){kb(a);hb(a);I(a,a.aoHeader);I(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ca(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=s(f.sWidth));K(a);e=z(a);"ssp"!=e&&("ajax"==e?na(a,[],function(c){var f=oa(a,c);for(b=0;b<f.length;b++)H(a,f[b]);a.iInitDisplayStart=d;K(a);C(a,!1);pa(a,c)},a):(C(a, +!1),pa(a)))}else setTimeout(function(){ra(a)},200)}function pa(a,b){a._bInitComplete=!0;b&&U(a);t(a,"aoInitComplete","init",[a,b])}function Pa(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Qa(a);t(a,null,"length",[a,c])}function lb(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=g.isArray(d[0]),f=e?d[0]:d,e=e?d[1]:d,d=g("<select/>",{name:c+"_length","aria-controls":c,"class":"select" +b.sLengthSelect}),h=0,i=f.length;h<i;h++)d[0][h]=new Option(e[h],f[h]);var j=g("<div><label/></div>").addClass(b.sLength); +a.aanFeatures.l||(j[0].id=c+"_length");b=a.oLanguage.sLengthMenu.split(/(_MENU_)/);j.children().append(1<b.length?[b[0],d,b[2]]:b[0]);g("select",j).val(a._iDisplayLength).bind("change.DT",function(){Pa(a,g(this).val());J(a)});g(a.nTable).bind("length.dt.DT",function(a,b,c){g("select",j).val(c)});return j[0]}function qb(a){var b=a.sPaginationType,c=p.ext.pager[b],d="function"===typeof c,e=function(a){J(a)},b=g("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id= +a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,j=a._iDisplayLength,g=a.fnRecordsDisplay(),m=-1===j,b=m?0:Math.ceil(b/j),j=m?1:Math.ceil(g/j),g=c(b,j),o,m=0;for(o=f.p.length;m<o;m++)La(a,"pageButton")(a,f.p[m],m,g,b,j)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Ra(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0> +d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:O(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(t(a,null,"page",[a]),c&&J(a));return b}function nb(a){return g("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&g(a.aanFeatures.r).css("display",b?"block":"none");t(a,null,"processing",[a,b])}function ob(a){var b= +g(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,h=b.children("caption"),i=h.length?h[0]._captionSide:null,j=g(b[0].cloneNode(!1)),n=g(b[0].cloneNode(!1)),m=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");m.length||(m=null);c=g("<div/>",{"class":f.sScrollWrapper}).append(g("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:s(d):"100%"}).append(g("<div/>", +{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(j.removeAttr("id").css("margin-left",0).append(b.children("thead")))).append("top"===i?h:null)).append(g("<div/>",{"class":f.sScrollBody}).css({overflow:"auto",height:!e?null:s(e),width:!d?null:s(d)}).append(b));m&&c.append(g("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:s(d):"100%"}).append(g("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left", +0).append(b.children("tfoot")))).append("bottom"===i?h:null));var b=c.children(),o=b[0],f=b[1],k=m?b[2]:null;d&&g(f).scroll(function(){var a=this.scrollLeft;o.scrollLeft=a;m&&(k.scrollLeft=a)});a.nScrollHead=o;a.nScrollBody=f;a.nScrollFoot=k;a.aoDrawCallback.push({fn:V,sName:"scrolling"});return c[0]}function V(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,f=b.iBarWidth,h=g(a.nScrollHead),i=h[0].style,j=h.children("div"),n=j[0].style,m=j.children("table"),j=a.nScrollBody,o=g(j),k=j.style,l=g(a.nScrollFoot).children("div"), +p=l.children("table"),r=g(a.nTHead),q=g(a.nTable),ba=q[0],L=ba.style,t=a.nTFoot?g(a.nTFoot):null,ca=a.oBrowser,v=ca.bScrollOversize,x,u,y,w,z,A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};q.children("thead, tfoot").remove();z=r.clone().prependTo(q);x=r.find("tr");y=z.find("tr");z.find("th, td").removeAttr("tabindex");t&&(w=t.clone().prependTo(q),u=t.find("tr"),w=w.find("tr"));c||(k.width="100%",h[0].style.width= +"100%");g.each(ma(a,z),function(b,c){D=ga(a,b);c.style.width=a.aoColumns[D].sWidth});t&&F(function(a){a.style.width=""},w);b.bCollapse&&""!==e&&(k.height=o[0].offsetHeight+r[0].offsetHeight+"px");h=q.outerWidth();if(""===c){if(L.width="100%",v&&(q.find("tbody").height()>j.offsetHeight||"scroll"==o.css("overflow-y")))L.width=s(q.outerWidth()-f)}else""!==d?L.width=s(d):h==o.width()&&o.height()<q.height()?(L.width=s(h-f),q.outerWidth()>h-f&&(L.width=s(h))):L.width=s(h);h=q.outerWidth();F(E,y);F(function(a){C.push(a.innerHTML); +A.push(s(g(a).css("width")))},y);F(function(a,b){a.style.width=A[b]},x);g(y).height(0);t&&(F(E,w),F(function(a){B.push(s(g(a).css("width")))},w),F(function(a,b){a.style.width=B[b]},u),g(w).height(0));F(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+C[b]+"</div>";a.style.width=A[b]},y);t&&F(function(a,b){a.innerHTML="";a.style.width=B[b]},w);if(q.outerWidth()<h){u=j.scrollHeight>j.offsetHeight||"scroll"==o.css("overflow-y")?h+f:h;if(v&&(j.scrollHeight> +j.offsetHeight||"scroll"==o.css("overflow-y")))L.width=s(u-f);(""===c||""!==d)&&O(a,1,"Possible column misalignment",6)}else u="100%";k.width=s(u);i.width=s(u);t&&(a.nScrollFoot.style.width=s(u));!e&&v&&(k.height=s(ba.offsetHeight+f));e&&b.bCollapse&&(k.height=s(e),b=c&&ba.offsetWidth>j.offsetWidth?f:0,ba.offsetHeight<j.offsetHeight&&(k.height=s(ba.offsetHeight+b)));b=q.outerWidth();m[0].style.width=s(b);n.width=s(b);m=q.height()>j.clientHeight||"scroll"==o.css("overflow-y");ca="padding"+(ca.bScrollbarLeft? +"Left":"Right");n[ca]=m?f+"px":"0px";t&&(p[0].style.width=s(b),l[0].style.width=s(b),l[0].style[ca]=m?f+"px":"0px");o.scroll();if(a.bSorted||a.bFiltered)j.scrollTop=0}function F(a,b,c){for(var d=0,e=0,f=b.length,h,i;e<f;){h=b[e].firstChild;for(i=c?c[e].firstChild:null;h;)1===h.nodeType&&(c?a(h,i,d):a(h,d),d++),h=h.nextSibling,i=c?i.nextSibling:null;e++}}function Ca(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,f=d.sX,h=d.sXInner,i=c.length,d=W(a,"bVisible"),j=g("th",a.nTHead),n=b.getAttribute("width"), +m=b.parentNode,o=!1,k,l;for(k=0;k<d.length;k++)l=c[d[k]],null!==l.sWidth&&(l.sWidth=zb(l.sWidthOrig,m),o=!0);if(!o&&!f&&!e&&i==Y(a)&&i==j.length)for(k=0;k<i;k++)c[k].sWidth=s(j.eq(k).width());else{i=g(b.cloneNode(!1)).css("visibility","hidden").removeAttr("id").append(g(a.nTHead).clone(!1)).append(g(a.nTFoot).clone(!1)).append(g("<tbody><tr/></tbody>"));i.find("tfoot th, tfoot td").css("width","");var p=i.find("tbody tr"),j=ma(a,i.find("thead")[0]);for(k=0;k<d.length;k++)l=c[d[k]],j[k].style.width= +null!==l.sWidthOrig&&""!==l.sWidthOrig?s(l.sWidthOrig):"";if(a.aoData.length)for(k=0;k<d.length;k++)o=d[k],l=c[o],g(Ab(a,o)).clone(!1).append(l.sContentPadding).appendTo(p);i.appendTo(m);f&&h?i.width(h):f?(i.css("width","auto"),i.width()<m.offsetWidth&&i.width(m.offsetWidth)):e?i.width(m.offsetWidth):n&&i.width(n);Bb(a,i[0]);if(f){for(k=h=0;k<d.length;k++)l=c[d[k]],e=g(j[k]).outerWidth(),h+=null===l.sWidthOrig?e:parseInt(l.sWidth,10)+e-g(j[k]).width();i.width(s(h));b.style.width=s(h)}for(k=0;k<d.length;k++)if(l= +c[d[k]],e=g(j[k]).width())l.sWidth=s(e);b.style.width=s(i.css("width"));i.remove()}n&&(b.style.width=s(n));if((n||f)&&!a._reszEvt)g(za).bind("resize.DT-"+a.sInstance,Ma(function(){U(a)})),a._reszEvt=!0}function Ma(a,b){var c=b||200,d,e;return function(){var b=this,h=+new Date,i=arguments;d&&h<d+c?(clearTimeout(e),e=setTimeout(function(){d=l;a.apply(b,i)},c)):d?(d=h,a.apply(b,i)):d=h}}function zb(a,b){if(!a)return 0;var c=g("<div/>").css("width",s(a)).appendTo(b||N.body),d=c[0].offsetWidth;c.remove(); +return d}function Bb(a,b){var c=a.oScroll;if(c.sX||c.sY)c=!c.sX?c.iBarWidth:0,b.style.width=s(g(b).outerWidth()-c)}function Ab(a,b){var c=Cb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?g("<td/>").html(A(a,c,b,"display"))[0]:d.anCells[b]}function Cb(a,b){for(var c,d=-1,e=-1,f=0,h=a.aoData.length;f<h;f++)c=A(a,f,b,"display")+"",c=c.replace(Ub,""),c.length>d&&(d=c.length,e=f);return e}function s(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Db(){if(!p.__scrollbarWidth){var a= +g("<p/>").css({width:"100%",height:200,padding:0})[0],b=g("<div/>").css({position:"absolute",top:0,left:0,width:200,height:150,padding:0,overflow:"hidden",visibility:"hidden"}).append(a).appendTo("body"),c=a.offsetWidth;b.css("overflow","scroll");a=a.offsetWidth;c===a&&(a=b[0].clientWidth);b.remove();p.__scrollbarWidth=c-a}return p.__scrollbarWidth}function Q(a){var b,c,d=[],e=a.aoColumns,f,h,i,j;b=a.aaSortingFixed;c=g.isPlainObject(b);var n=[];f=function(a){a.length&&!g.isArray(a[0])?n.push(a):n.push.apply(n, +a)};g.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){j=n[a][0];f=e[j].aDataSort;b=0;for(c=f.length;b<c;b++)h=f[b],i=e[h].sType||"string",d.push({src:j,col:h,dir:n[a][1],index:n[a][2],type:i,formatter:p.ext.type.order[i+"-pre"]})}return d}function jb(a){var b,c,d=[],e=p.ext.type.order,f=a.aoData,h=0,i,g=a.aiDisplayMaster,n;Da(a);n=Q(a);b=0;for(c=n.length;b<c;b++)i=n[b],i.formatter&&h++,Eb(a,i.col);if("ssp"!=z(a)&&0!==n.length){b=0;for(c=g.length;b<c;b++)d[g[b]]= +b;h===n.length?g.sort(function(a,b){var c,e,h,g,i=n.length,j=f[a]._aSortData,l=f[b]._aSortData;for(h=0;h<i;h++)if(g=n[h],c=j[g.col],e=l[g.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===g.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):g.sort(function(a,b){var c,h,g,i,j=n.length,l=f[a]._aSortData,p=f[b]._aSortData;for(g=0;g<j;g++)if(i=n[g],c=l[i.col],h=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,h),0!==c)return c;c=d[a];h=d[b];return c<h?-1:c>h?1:0})}a.bSorted=!0}function Fb(a){for(var b,c, +d=a.aoColumns,e=Q(a),a=a.oLanguage.oAria,f=0,h=d.length;f<h;f++){c=d[f];var i=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var g=c.nTh;g.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(g.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=i[e[0].index+1]||i[0]):c=i[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);g.setAttribute("aria-label",b)}}function Sa(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,h=function(a){var b=a._idx;b===l&&(b=g.inArray(a[1], +f));return b+1>=f.length?0:b+1};c&&a.oFeatures.bSortMulti?(c=g.inArray(b,B(e,"0")),-1!==c?(b=h(e[c]),e[c][1]=f[b],e[c]._idx=b):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=h(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);K(a);"function"==typeof d&&d(a)}function Ka(a,b,c,d){var e=a.aoColumns[c];Ta(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Sa(a,c,b.shiftKey,d);"ssp"!==z(a)&&C(a,!1)},0)):Sa(a, +c,b.shiftKey,d))})}function sa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=Q(a),e=a.oFeatures,f,h;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)h=b[e].src,g(B(a.aoData,"anCells",h)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)h=d[e].src,g(B(a.aoData,"anCells",h)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Eb(a,b){var c=a.aoColumns[b],d=p.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,X(a,b)));for(var f,h=p.ext.type.order[c.sType+"-pre"],g=0,j=a.aoData.length;g< +j;g++)if(c=a.aoData[g],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[g]:A(a,g,b,"sort"),c._aSortData[b]=h?h(f):f}function ta(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={iCreate:+new Date,iStart:a._iDisplayStart,iLength:a._iDisplayLength,aaSorting:g.extend(!0,[],a.aaSorting),oSearch:g.extend(!0,{},a.oPreviousSearch),aoSearchCols:g.extend(!0,[],a.aoPreSearchCols),abVisCols:B(a.aoColumns,"bVisible")};t(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.fnStateSaveCallback.call(a.oInstance, +a,b)}}function Gb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&(b=t(a,"aoStateLoadParams","stateLoadParams",[a,e]),-1===g.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.iCreate<+new Date-1E3*b)&&d.length===e.aoSearchCols.length))){a.oLoadedState=g.extend(!0,{},e);a._iDisplayStart=e.iStart;a.iInitDisplayStart=e.iStart;a._iDisplayLength=e.iLength;a.aaSorting=g.map(e.aaSorting,function(a){return a[0]>=d.length?[0,a[1]]:a});g.extend(a.oPreviousSearch, +e.oSearch);g.extend(!0,a.aoPreSearchCols,e.aoSearchCols);var f=e.abVisCols;b=0;for(c=f.length;b<c;b++)d[b].bVisible=f[b];t(a,"aoStateLoaded","stateLoaded",[a,e])}}}function ua(a){var b=p.settings,a=g.inArray(a,B(b,"nTable"));return-1!==a?b[a]:null}function O(a,b,c,d){c="DataTables warning: "+(null!==a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)za.console&&console.log&&console.log(c);else if(a=p.ext,"alert"==(a.sErrMode|| +a.errMode))alert(c);else throw Error(c);}function D(a,b,c,d){g.isArray(c)?g.each(c,function(c,d){g.isArray(d)?D(a,b,d[0],d[1]):D(a,b,d)}):(d===l&&(d=c),b[c]!==l&&(a[d]=b[c]))}function Hb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],g.isPlainObject(d)?(g.isPlainObject(a[e])||(a[e]={}),g.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&g.isArray(d)?d.slice():d);return a}function Ta(a,b,c){g(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&& +(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function y(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function t(a,b,c,d){var e=[];b&&(e=g.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&g(a.nTable).trigger(c+".dt",d);return e}function Qa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;c===a.fnRecordsDisplay()&&(b=c-d);if(-1===d||0>b)b=0;a._iDisplayStart=b}function La(a,b){var c=a.renderer,d=p.ext.renderer[b];return g.isPlainObject(c)&& +c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function z(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Ua(a,b){var c=[],c=Ib.numbers_length,d=Math.floor(c/2);b<=c?c=R(0,b):a<=d?(c=R(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=R(b-(c-2),b):(c=R(a-1,a+2),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function bb(a){g.each({num:function(b){return va(b,a)},"num-fmt":function(b){return va(b,a,Va)},"html-num":function(b){return va(b, +a,wa)},"html-num-fmt":function(b){return va(b,a,wa,Va)}},function(b,c){u.type.order[b+a+"-pre"]=c})}function Jb(a){return function(){var b=[ua(this[p.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return p.ext.internal[a].apply(this,b)}}var p,u,q,r,x,Wa={},Kb=/[\r\n]/g,wa=/<.*?>/g,Vb=/^[\d\+\-a-zA-Z]/,Sb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Va=/[',$\u00a3\u20ac\u00a5%\u2009\u202F]/g,da=function(a){return!a||"-"===a?!0:!1},Lb=function(a){var b= +parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Mb=function(a,b){Wa[b]||(Wa[b]=RegExp(Oa(b),"g"));return"string"===typeof a?a.replace(/\./g,"").replace(Wa[b],"."):a},Xa=function(a,b,c){var d="string"===typeof a;b&&d&&(a=Mb(a,b));c&&d&&(a=a.replace(Va,""));return!a||"-"===a||!isNaN(parseFloat(a))&&isFinite(a)},Nb=function(a,b,c){return da(a)?!0:a&&"string"!==typeof a?null:Xa(a.replace(wa,""),b,c)?!0:null},B=function(a,b,c){var d=[],e=0,f=a.length;if(c!==l)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]); +else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},xa=function(a,b,c,d){var e=[],f=0,h=b.length;if(d!==l)for(;f<h;f++)e.push(a[b[f]][c][d]);else for(;f<h;f++)e.push(a[b[f]][c]);return e},R=function(a,b){var c=[],d;b===l?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Ja=function(a){var b=[],c,d,e=a.length,f,h=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<h;f++)if(b[f]===c)continue a;b.push(c);h++}return b},w=function(a,b,c){a[b]!==l&&(a[c]=a[b])},Z=/\[.*?\]$/,P=/\(\)$/,qa=g("<div>")[0],Tb=qa.textContent!== +l,Ub=/<.*?>/g;p=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new q(ua(this[u.iApiIndex])):new q(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=g.isArray(a)&&(g.isArray(a[0])||g.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===l||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===l|| +a?b.draw(!1):(""!==d.sX||""!==d.sY)&&V(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===l||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],g=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,g);(c===l||c)&&d.draw();return g};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(!a)};this.fnFilter=function(a,b,c,d,e,g){e=this.api(!0);null=== +b||b===l?e.search(a,c,d,g):e.column(b).search(a,c,d,g);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==l){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==l||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==l?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"== +c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===l||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===l||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return ua(this[u.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()}; +this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var g=this.api(!0);c===l||null===c?g.row(b).data(a):g.cell(b,c).data(a);(e===l||e)&&g.columns.adjust();(d===l||d)&&g.draw();return 0};this.fnVersionCheck=u.fnVersionCheck;var b=this,c=a===l,d=this.length;c&&(a={});this.oApi=this.internal=u.internal;for(var e in p.ext.internal)e&&(this[e]=Jb(e));this.each(function(){var e={},h=1<d?Hb(e,a,!0):a,i=0,j,n=this.getAttribute("id"),e=!1,m=p.defaults; +if("table"!=this.nodeName.toLowerCase())O(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{cb(m);db(m.column);G(m,m,!0);G(m.column,m.column,!0);G(m,h);var o=p.settings,i=0;for(j=o.length;i<j;i++){if(o[i].nTable==this){j=h.bRetrieve!==l?h.bRetrieve:m.bRetrieve;if(c||j)return o[i].oInstance;if(h.bDestroy!==l?h.bDestroy:m.bDestroy){o[i].oInstance.fnDestroy();break}else{O(o[i],0,"Cannot reinitialise DataTable",3);return}}if(o[i].sTableId==this.id){o.splice(i,1);break}}if(null===n||""=== +n)this.id=n="DataTables_Table_"+p.ext._unique++;var k=g.extend(!0,{},p.models.oSettings,{nTable:this,oApi:b.internal,oInit:h,sDestroyWidth:g(this)[0].style.width,sInstance:n,sTableId:n});o.push(k);k.oInstance=1===b.length?b:g(this).dataTable();cb(h);h.oLanguage&&M(h.oLanguage);h.aLengthMenu&&!h.iDisplayLength&&(h.iDisplayLength=g.isArray(h.aLengthMenu[0])?h.aLengthMenu[0][0]:h.aLengthMenu[0]);h=Hb(g.extend(!0,{},m),h);D(k.oFeatures,h,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" ")); +D(k,h,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);D(k.oScroll,h,[["sScrollX","sX"],["sScrollXInner","sXInner"], +["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);D(k.oLanguage,h,"fnInfoCallback");y(k,"aoDrawCallback",h.fnDrawCallback,"user");y(k,"aoServerParams",h.fnServerParams,"user");y(k,"aoStateSaveParams",h.fnStateSaveParams,"user");y(k,"aoStateLoadParams",h.fnStateLoadParams,"user");y(k,"aoStateLoaded",h.fnStateLoaded,"user");y(k,"aoRowCallback",h.fnRowCallback,"user");y(k,"aoRowCreatedCallback",h.fnCreatedRow,"user");y(k,"aoHeaderCallback",h.fnHeaderCallback,"user");y(k,"aoFooterCallback",h.fnFooterCallback, +"user");y(k,"aoInitComplete",h.fnInitComplete,"user");y(k,"aoPreDrawCallback",h.fnPreDrawCallback,"user");n=k.oClasses;h.bJQueryUI?(g.extend(n,p.ext.oJUIClasses,h.oClasses),h.sDom===m.sDom&&"lfrtip"===m.sDom&&(k.sDom='<"H"lfr>t<"F"ip>'),k.renderer)?g.isPlainObject(k.renderer)&&!k.renderer.header&&(k.renderer.header="jqueryui"):k.renderer="jqueryui":g.extend(n,p.ext.classes,h.oClasses);g(this).addClass(n.sTable);if(""!==k.oScroll.sX||""!==k.oScroll.sY)k.oScroll.iBarWidth=Db();!0===k.oScroll.sX&&(k.oScroll.sX= +"100%");k.iInitDisplayStart===l&&(k.iInitDisplayStart=h.iDisplayStart,k._iDisplayStart=h.iDisplayStart);null!==h.iDeferLoading&&(k.bDeferLoading=!0,i=g.isArray(h.iDeferLoading),k._iRecordsDisplay=i?h.iDeferLoading[0]:h.iDeferLoading,k._iRecordsTotal=i?h.iDeferLoading[1]:h.iDeferLoading);""!==h.oLanguage.sUrl?(k.oLanguage.sUrl=h.oLanguage.sUrl,g.getJSON(k.oLanguage.sUrl,null,function(a){M(a);G(m.oLanguage,a);g.extend(true,k.oLanguage,h.oLanguage,a);ra(k)}),e=!0):g.extend(!0,k.oLanguage,h.oLanguage); +null===h.asStripeClasses&&(k.asStripeClasses=[n.sStripeOdd,n.sStripeEven]);var i=k.asStripeClasses,r=g("tbody tr:eq(0)",this);-1!==g.inArray(!0,g.map(i,function(a){return r.hasClass(a)}))&&(g("tbody tr",this).removeClass(i.join(" ")),k.asDestroyStripes=i.slice());var o=[],q,i=this.getElementsByTagName("thead");0!==i.length&&($(k.aoHeader,i[0]),o=ma(k));if(null===h.aoColumns){q=[];i=0;for(j=o.length;i<j;i++)q.push(null)}else q=h.aoColumns;i=0;for(j=q.length;i<j;i++)Aa(k,o?o[i]:null);gb(k,h.aoColumnDefs, +q,function(a,b){fa(k,a,b)});if(r.length){var s=function(a,b){return a.getAttribute("data-"+b)?b:null};g.each(ia(k,r[0]).cells,function(a,b){var c=k.aoColumns[a];if(c.mData===a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:l,type:d!==null?a+".@data-"+d:l,filter:e!==null?a+".@data-"+e:l};fa(k,a)}}})}var u=k.oFeatures;h.bStateSave&&(u.bStateSave=!0,Gb(k,h),y(k,"aoDrawCallback",ta,"state_save"));if(h.aaSorting=== +l){o=k.aaSorting;i=0;for(j=o.length;i<j;i++)o[i][1]=k.aoColumns[i].asSorting[0]}sa(k);u.bSort&&y(k,"aoDrawCallback",function(){if(k.bSorted){var a=Q(k),b={};g.each(a,function(a,c){b[c.src]=c.dir});t(k,null,"order",[k,a,b]);Fb(k)}});y(k,"aoDrawCallback",function(){(k.bSorted||z(k)==="ssp"||u.bDeferRender)&&sa(k)},"sc");eb(k);i=g(this).children("caption").each(function(){this._captionSide=g(this).css("caption-side")});j=g(this).children("thead");0===j.length&&(j=g("<thead/>").appendTo(this));k.nTHead= +j[0];j=g(this).children("tbody");0===j.length&&(j=g("<tbody/>").appendTo(this));k.nTBody=j[0];j=g(this).children("tfoot");if(0===j.length&&0<i.length&&(""!==k.oScroll.sX||""!==k.oScroll.sY))j=g("<tfoot/>").appendTo(this);0===j.length||0===j.children().length?g(this).addClass(n.sNoFooter):0<j.length&&(k.nTFoot=j[0],$(k.aoFooter,k.nTFoot));if(h.aaData)for(i=0;i<h.aaData.length;i++)H(k,h.aaData[i]);else(k.bDeferLoading||"dom"==z(k))&&ha(k,g(k.nTBody).children("tr"));k.aiDisplay=k.aiDisplayMaster.slice(); +k.bInitialised=!0;!1===e&&ra(k)}});b=null;return this};var Ob=[],v=Array.prototype,Wb=function(a){var b,c,d=p.settings,e=g.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=g.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=g(a):a instanceof g&&(c=a)}else return[];if(c)return c.map(function(){b=g.inArray(this,e);return-1!==b?d[b]:null}).toArray()}; +p.Api=q=function(a,b){if(!this instanceof q)throw"DT API must be constructed as a new object";var c=[],d=function(a){(a=Wb(a))&&c.push.apply(c,a)};if(g.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=Ja(c);b&&this.push.apply(this,b.toArray?b.toArray():b);this.selector={rows:null,cols:null,opts:null};q.extend(this,this,Ob)};q.prototype={concat:v.concat,context:[],each:function(a){if(v.forEach)v.forEach.call(this,a,this);else for(var b=0,c=this.length;b<c;b++)a.call(this,this[b], +b,this);return this},eq:function(a){var b=this.context;return b.length>a?new q(b[a],this[a]):null},filter:function(a){var b=[];if(v.filter)b=v.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new q(this.context,b)},flatten:function(){var a=[];return new q(this.context,a.concat.apply(a,this.toArray()))},join:v.join,indexOf:v.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a, +b,c){var d=[],e,f,h,g,j,n=this.context,m,o,k=this.selector;"string"===typeof a&&(c=b,b=a,a=!1);f=0;for(h=n.length;f<h;f++)if("table"===b)e=c(n[f],f),e!==l&&d.push(e);else if("columns"===b||"rows"===b)e=c(n[f],this[f],f),e!==l&&d.push(e);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){o=this[f];"column-rows"===b&&(m=Ya(n[f],k.opts));g=0;for(j=o.length;g<j;g++)e=o[g],e="cell"===b?c(n[f],e.row,e.column,f,g):c(n[f],e,f,g,m),e!==l&&d.push(e)}return d.length?(a=new q(n,a?d.concat.apply([], +d):d),b=a.selector,b.rows=k.rows,b.cols=k.cols,b.opts=k.opts,a):this},lastIndexOf:v.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(v.map)b=v.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new q(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:v.pop,push:v.push,reduce:v.reduce||function(a,b){return fb(this,a,b,0,this.length,1)},reduceRight:v.reduceRight|| +function(a,b){return fb(this,a,b,this.length-1,-1,-1)},reverse:v.reverse,selector:null,shift:v.shift,sort:v.sort,splice:v.splice,toArray:function(){return v.slice.call(this)},to$:function(){return g(this)},toJQuery:function(){return g(this)},unique:function(){return new q(this.context,Ja(this))},unshift:v.unshift};q.extend=function(a,b,c){if(b&&(b instanceof q||b.__dt_wrapper)){var d,e,f,h=function(b,c){return function(){var d=b.apply(a,arguments);q.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d< +e;d++)f=c[d],b[f.name]="function"===typeof f.val?h(f.val,f):g.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,q.extend(a,b[f.name],f.propExt)}};q.register=r=function(a,b){if(g.isArray(a))for(var c=0,d=a.length;c<d;c++)q.register(a[c],b);else{for(var e=a.split("."),f=Ob,h,i,c=0,d=e.length;c<d;c++){h=(i=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var j;a:{j=0;for(var n=f.length;j<n;j++)if(f[j].name===h){j=f[j];break a}j=null}j||(j={name:h,val:{},methodExt:[],propExt:[]},f.push(j));c=== +d-1?j.val=b:f=i?j.methodExt:j.propExt}q.ready&&p.api.build()}};q.registerPlural=x=function(a,b,c){q.register(a,c);q.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof q?a.length?g.isArray(a[0])?new q(a.context,a[0]):a[0]:l:a})};r("tables()",function(a){var b;if(a){b=q;var c=this.context;if("number"===typeof a)a=[c[a]];else var d=g.map(c,function(a){return a.nTable}),a=g(d).filter(a).map(function(){var a=g.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b= +this;return b});r("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new q(b[0]):a});x("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable})});x("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody})});x("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead})});x("tables().footer()","table().footer()",function(){return this.iterator("table", +function(a){return a.nTFoot})});r("draw()",function(a){return this.iterator("table",function(b){K(b,!1===a)})});r("page()",function(a){return a===l?this.page.info().page:this.iterator("table",function(b){Ra(b,a)})});r("page.info()",function(){if(0===this.context.length)return l;var a=this.context[0],b=a._iDisplayStart,c=a._iDisplayLength,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d}}); +r("page.len()",function(a){return a===l?0!==this.context.length?this.context[0]._iDisplayLength:l:this.iterator("table",function(b){Pa(b,a)})});var Pb=function(a,b,c){"ssp"==z(a)?K(a,b):(C(a,!0),na(a,[],function(c){ja(a);for(var c=oa(a,c),d=0,h=c.length;d<h;d++)H(a,c[d]);K(a,b);C(a,!1)}));if(c){var d=new q(a);d.one("draw",function(){c(d.ajax.json())})}};r("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});r("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData}); +r("ajax.reload()",function(a,b){return this.iterator("table",function(c){Pb(c,!1===b,a)})});r("ajax.url()",function(a){var b=this.context;if(a===l){if(0===b.length)return l;b=b[0];return b.ajax?g.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){g.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});r("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Pb(c,!1===b,a)})});var Za=function(a,b){var c=[],d,e,f,h,i,j;if(!a||"string"===typeof a|| +a.length===l)a=[a];f=0;for(h=a.length;f<h;f++){e=a[f]&&a[f].split?a[f].split(","):[a[f]];i=0;for(j=e.length;i<j;i++)(d=b("string"===typeof e[i]?g.trim(e[i]):e[i]))&&d.length&&c.push.apply(c,d)}return c},$a=function(a){a||(a={});a.filter&&!a.search&&(a.search=a.filter);return{search:a.search||"none",order:a.order||"current",page:a.page||"all"}},ab=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Ya=function(a,b){var c, +d,e,f=[],h=a.aiDisplay;c=a.aiDisplayMaster;var i=b.search;d=b.order;e=b.page;if("ssp"==z(a))return"removed"===i?[]:R(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(h[c])}else if("current"==d||"applied"==d)f="none"==i?c.slice():"applied"==i?h.slice():g.map(c,function(a){return-1===g.inArray(a,h)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==i?f.push(c):(e=g.inArray(c,h),(-1===e&&"removed"==i||1===e&&"applied"==i)&&f.push(c))}return f}; +r("rows()",function(a,b){a===l?a="":g.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(c){var e=b;return Za(a,function(a){var b=Lb(a);if(b!==null&&!e)return[b];var i=Ya(c,e);if(b!==null&&g.inArray(b,i)!==-1)return[b];if(!a)return i;for(var b=[],j=0,n=i.length;j<n;j++)b.push(c.aoData[i[j]].nTr);return a.nodeName&&g.inArray(a,b)!==-1?[a._DT_RowIndex]:g(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()})});c.selector.rows=a;c.selector.opts=b;return c});r("rows().nodes()", +function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||l})});r("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return xa(a.aoData,b,"_aData")})});x("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData})});x("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){la(b,c,a)})});x("rows().indexes()","row().index()",function(){return this.iterator("row", +function(a,b){return b})});x("rows().remove()","row().remove()",function(){var a=this;return this.iterator("row",function(b,c,d){var e=b.aoData;e.splice(c,1);for(var f=0,h=e.length;f<h;f++)null!==e[f].nTr&&(e[f].nTr._DT_RowIndex=f);g.inArray(c,b.aiDisplay);ka(b.aiDisplayMaster,c);ka(b.aiDisplay,c);ka(a[d],c,!1);Qa(b)})});r("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,h,g=[];f=0;for(h=a.length;f<h;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?g.push(ha(b,c)[0]): +g.push(H(b,c));return g}),c=this.rows(-1);c.pop();c.push.apply(c,b.toArray());return c});r("row()",function(a,b){return ab(this.rows(a,b))});r("row().data()",function(a){var b=this.context;if(a===l)return b.length&&this.length?b[0].aoData[this[0]]._aData:l;b[0].aoData[this[0]]._aData=a;la(b[0],this[0],"data");return this});r("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});r("row.add()",function(a){a instanceof g&&a.length&&(a=a[0]);var b= +this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ha(b,a)[0]:H(b,a)});return this.row(b[0])});var Qb=function(a){var b=this.context;if(b.length&&this.length){var c=b[0].aoData[this[0]];if(c._details){(c._detailsShow=a)?c._details.insertAfter(c.nTr):c._details.remove();var d=b[0],e=new q(d);e.off("draw.dt.DT_details column-visibility.dt.DT_details");0<B(d.aoData,"_details").length&&(e.on("draw.dt.DT_details",function(){e.rows({page:"current"}).eq(0).each(function(a){a= +d.aoData[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),e.on("column-visibility.dt.DT_details",function(a,b){for(var c,d=Y(b),e=0,g=b.aoData.length;e<g;e++)c=b.aoData[e],c._details&&c._details.children("td[colspan]").attr("colspan",d)}))}}return this};r("row().child()",function(a,b){var c=this.context;if(a===l)return c.length&&this.length?c[0].aoData[this[0]]._details:l;if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(a.nodeName&&"tr"===a.nodeName.toLowerCase())e.push(a); +else{var c=g("<tr><td/></tr>");g("td",c).addClass(b).html(a)[0].colSpan=Y(d);e.push(c[0])}};if(g.isArray(a)||a instanceof g)for(var h=0,i=a.length;h<i;h++)f(a[h],b);else f(a,b);c._details&&c._details.remove();c._details=g(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});r(["row().child.show()","row().child().show()"],function(){Qb.call(this,!0);return this});r(["row().child.hide()","row().child().hide()"],function(){Qb.call(this,!1);return this});r("row().child.isShown()",function(){var a= +this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var Xb=/^(.*):(name|visIdx|visible)$/;r("columns()",function(a,b){a===l?a="":g.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(b){var c=a,f=b.aoColumns,h=B(f,"sName"),i=B(f,"nTh");return Za(c,function(a){var c=Lb(a);if(a==="")return R(f.length);if(c!==null)return[c>=0?c:f.length+c];var e=typeof a==="string"?a.match(Xb):"";if(e)switch(e[2]){case "visIdx":case "visible":a=parseInt(e[1],10); +if(a<0){c=g.map(f,function(a,b){return a.bVisible?b:null});return[c[c.length+a]]}return[ga(b,a)];case "name":return g.map(h,function(a,b){return a===e[1]?b:null})}else return g(i).filter(a).map(function(){return g.inArray(this,i)}).toArray()})});c.selector.cols=a;c.selector.opts=b;return c});x("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh})});x("columns().footer()","column().footer()",function(){return this.iterator("column", +function(a,b){return a.aoColumns[b].nTf})});x("columns().data()","column().data()",function(){return this.iterator("column-rows",function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(A(a,e[d],b,""));return c})});x("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return xa(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)})});x("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d, +e){return xa(a.aoData,e,"anCells",b)})});x("columns().visible()","column().visible()",function(a){return this.iterator("column",function(b,c){var d;if(a===l)d=b.aoColumns[c].bVisible;else{var e=b.aoColumns;d=e[c];var f=b.aoData,h,i,j;if(a===l)d=d.bVisible;else{if(d.bVisible!==a){if(a){var n=g.inArray(!0,B(e,"bVisible"),c+1);h=0;for(i=f.length;h<i;h++)j=f[h].nTr,e=f[h].anCells,j&&j.insertBefore(e[c],e[n]||null)}else g(B(b.aoData,"anCells",c)).detach(),d.bVisible=!1,I(b,b.aoHeader),I(b,b.aoFooter), +ta(b);d.bVisible=a;I(b,b.aoHeader);I(b,b.aoFooter);U(b);(b.oScroll.sX||b.oScroll.sY)&&V(b);t(b,null,"column-visibility",[b,c,a]);ta(b)}d=void 0}}return d})});x("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?X(b,c):c})});r("columns.adjust()",function(){return this.iterator("table",function(a){U(a)})});r("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return ga(c, +b);if("fromData"===a||"toVisible"===a)return X(c,b)}});r("column()",function(a,b){return ab(this.columns(a,b))});r("cells()",function(a,b,c){g.isPlainObject(a)&&(a.row?(c=b,b=null):(c=a,a=null));g.isPlainObject(b)&&(c=b,b=null);if(null===b||b===l)return this.iterator("table",function(b){var d=a,e=$a(c),f=b.aoData,h=Ya(b,e),e=xa(f,h,"anCells"),i=g([].concat.apply([],e)),j,m=b.aoColumns.length,n,l,p,r;return Za(d,function(a){if(a){if(g.isPlainObject(a))return[a]}else{n=[];l=0;for(p=h.length;l<p;l++){j= +h[l];for(r=0;r<m;r++)n.push({row:j,column:r})}return n}return i.filter(a).map(function(a,b){j=b.parentNode._DT_RowIndex;return{row:j,column:g.inArray(b,f[j].anCells)}}).toArray()})});var d=this.columns(b,c),e=this.rows(a,c),f,h,i,j,n,m=this.iterator("table",function(a,b){f=[];h=0;for(i=e[b].length;h<i;h++){j=0;for(n=d[b].length;j<n;j++)f.push({row:e[b][h],column:d[b][j]})}return f});g.extend(m.selector,{cols:b,rows:a,opts:c});return m});x("cells().nodes()","cell().node()",function(){return this.iterator("cell", +function(a,b,c){return a.aoData[b].anCells[c]})});r("cells().data()",function(){return this.iterator("cell",function(a,b,c){return A(a,b,c)})});x("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]})});x("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:X(a,c)}})});r(["cells().invalidate()","cell().invalidate()"],function(a){var b= +this.selector;this.rows(b.rows,b.opts).invalidate(a);return this});r("cell()",function(a,b,c){return ab(this.cells(a,b,c))});r("cell().data()",function(a){var b=this.context,c=this[0];if(a===l)return b.length&&c.length?A(b[0],c[0].row,c[0].column):l;Ea(b[0],c[0].row,c[0].column,a);la(b[0],c[0].row,"data",c[0].column);return this});r("order()",function(a,b){var c=this.context;if(a===l)return 0!==c.length?c[0].aaSorting:l;"number"===typeof a?a=[[a,b]]:g.isArray(a[0])||(a=Array.prototype.slice.call(arguments)); +return this.iterator("table",function(b){b.aaSorting=a.slice()})});r("order.listener()",function(a,b,c){return this.iterator("table",function(d){Ka(d,a,b,c)})});r(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];g.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});r("search()",function(a,b,c,d){var e=this.context;return a===l?0!==e.length?e[0].oPreviousSearch.sSearch:l:this.iterator("table",function(e){e.oFeatures.bFilter&& +aa(e,g.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});r(["columns().search()","column().search()"],function(a,b,c,d){return this.iterator("column",function(e,f){var h=e.aoPreSearchCols;if(a===l)return h[f].sSearch;e.oFeatures.bFilter&&(g.extend(h[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),aa(e,e.oPreviousSearch,1))})});p.versionCheck=p.fnVersionCheck=function(a){for(var b= +p.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};p.isDataTable=p.fnIsDataTable=function(a){var b=g(a).get(0),c=!1;g.each(p.settings,function(a,e){if(e.nTable===b||e.nScrollHead===b||e.nScrollFoot===b)c=!0});return c};p.tables=p.fnTables=function(a){return jQuery.map(p.settings,function(b){if(!a||a&&g(b.nTable).is(":visible"))return b.nTable})};p.camelToHungarian=G;r("$()",function(a,b){var c=this.rows(b).nodes(), +c=g(c);return g([].concat(c.filter(a).toArray(),c.find(a).toArray()))});g.each(["on","one","off"],function(a,b){r(b+"()",function(){var a=Array.prototype.slice.call(arguments);-1===a[0].indexOf(".dt")&&(a[0]+=".dt");var d=g(this.tables().nodes());d[b].apply(d,a);return this})});r("clear()",function(){return this.iterator("table",function(a){ja(a)})});r("settings()",function(){return new q(this.context,this.context)});r("data()",function(){return this.iterator("table",function(a){return B(a.aoData, +"_aData")}).flatten()});r("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,h=b.nTHead,i=b.nTFoot,j=g(e),f=g(f),n=g(b.nTableWrapper),m=g.map(b.aoData,function(a){return a.nTr}),l;b.bDestroying=!0;t(b,"aoDestroyCallback","destroy",[b]);a||(new q(b)).columns().visible(!0);n.unbind(".DT").find(":not(tbody *)").unbind(".DT");g(za).unbind(".DT-"+b.sInstance);e!=h.parentNode&&(j.children("thead").detach(),j.append(h)); +i&&e!=i.parentNode&&(j.children("tfoot").detach(),j.append(i));j.detach();n.detach();b.aaSorting=[];b.aaSortingFixed=[];sa(b);g(m).removeClass(b.asStripeClasses.join(" "));g("th, td",h).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(g("th span."+d.sSortIcon+", td span."+d.sSortIcon,h).detach(),g("th, td",h).each(function(){var a=g("div."+d.sSortJUIWrapper,this);g(this).append(a.contents());a.detach()}));!a&&c&&c.insertBefore(e,b.nTableReinsertBefore); +f.children().detach();f.append(m);j.css("width",b.sDestroyWidth).removeClass(d.sTable);(l=b.asDestroyStripes.length)&&f.children().each(function(a){g(this).addClass(b.asDestroyStripes[a%l])});c=g.inArray(b,p.settings);-1!==c&&p.settings.splice(c,1)})});p.version="1.10.0";p.settings=[];p.models={};p.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};p.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null};p.models.oColumn= +{idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};p.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null, +aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null, +fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null, +iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": 升序排列",sSortDescending:":降序排列"},oPaginate:{sFirst:"第一页",sLast:"最后一页",sNext:"下一页",sPrevious:"上一页"},sEmptyTable:"没有数据",sInfo:"显示 _START_ 到 _END_ ,共 _TOTAL_ 条",sInfoEmpty:"没有数据",sInfoFiltered:"(从 _MAX_ 条中过滤)",sInfoPostFix:"",sDecimal:"", +sThousands:",",sLengthMenu:"显示 _MENU_ 条",sLoadingRecords:"加载中...",sProcessing:"处理中...",sSearch:"从当前数据中检索:",sUrl:"",sZeroRecords:"没有找到匹配的记录"},oSearch:g.extend({},p.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null};S(p.defaults);p.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null, +mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};S(p.defaults.column);p.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1, +bScrollbarLeft:!1},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null, +nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:l,oAjaxData:l,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null, +oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==z(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==z(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null, +nScrollFoot:null,aLastSort:[],oPlugins:{}};p.ext=u={classes:{},errMode:"alert",feature:[],search:[],internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:p.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:p.version};g.extend(u,{afnFiltering:u.search,aTypes:u.type.detect,ofnSearch:u.type.search,oSort:u.type.order,afnSortData:u.order,aoFeatures:u.feature,oApi:u.internal,oStdClasses:u.classes,oPagination:u.pager}); +g.extend(p.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled", +sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"", +sJUIHeader:"",sJUIFooter:""});var ya="",ya="",E=ya+"ui-state-default",ea=ya+"css_right ui-icon ui-icon-",Rb=ya+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";g.extend(p.ext.oJUIClasses,p.ext.classes,{sPageButton:"fg-button ui-button "+E,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:E+" sorting_asc",sSortDesc:E+" sorting_desc",sSortable:E+" sorting", +sSortableAsc:E+" sorting_asc_disabled",sSortableDesc:E+" sorting_desc_disabled",sSortableNone:E+" sorting_disabled",sSortJUIAsc:ea+"triangle-1-n",sSortJUIDesc:ea+"triangle-1-s",sSortJUI:ea+"carat-2-n-s",sSortJUIAscAllowed:ea+"carat-1-n",sSortJUIDescAllowed:ea+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+E,sScrollFoot:"dataTables_scrollFoot "+E,sHeaderTH:E,sFooterTH:E,sJUIHeader:Rb+" ui-corner-tl ui-corner-tr",sJUIFooter:Rb+ +" ui-corner-bl ui-corner-br"});var Ib=p.ext.pager;g.extend(Ib,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},simple_numbers:function(a,b){return["previous",Ua(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Ua(a,b),"next","last"]},_numbers:Ua,numbers_length:7});g.extend(!0,p.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var h=a.oClasses,i=a.oLanguage.oPaginate,j,l,m=0,o=function(b,d){var k,p,r,q,s=function(b){Ra(a,b.data.action, +true)};k=0;for(p=d.length;k<p;k++){q=d[k];if(g.isArray(q)){r=g("<"+(q.DT_el||"div")+"/>").appendTo(b);o(r,q)}else{l=j="";switch(q){case "ellipsis":b.append("<span>…</span>");break;case "first":j=i.sFirst;l=q+(e>0?"":" "+h.sPageButtonDisabled);break;case "previous":j=i.sPrevious;l=q+(e>0?"":" "+h.sPageButtonDisabled);break;case "next":j=i.sNext;l=q+(e<f-1?"":" "+h.sPageButtonDisabled);break;case "last":j=i.sLast;l=q+(e<f-1?"":" "+h.sPageButtonDisabled);break;default:j=q+1;l=e===q?h.sPageButtonActive: +""}if(j){r=g("<a>",{"class":h.sPageButton+" "+l,"aria-controls":a.sTableId,"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof q==="string"?a.sTableId+"_"+q:null}).html(j).appendTo(b);Ta(r,{action:q},s);m++}}}},k=g(N.activeElement).data("dt-idx");o(g(b).empty(),d);k!==null&&g(b).find("[data-dt-idx="+k+"]").focus()}}});var va=function(a,b,c,d){if(!a||"-"===a)return-Infinity;b&&(a=Mb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};g.extend(u.type.order,{"date-pre":function(a){return Date.parse(a)|| +0},"html-pre":function(a){return!a?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return"string"===typeof a?a.toLowerCase():!a||!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});bb("");g.extend(p.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Xa(a,c)?"num"+c:null},function(a){if(a&&!Vb.test(a))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||da(a)?"date": +null},function(a,b){var c=b.oLanguage.sDecimal;return Xa(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Nb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Nb(a,c,!0)?"html-num-fmt"+c:null},function(a){return da(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);g.extend(p.ext.type.search,{html:function(a){return da(a)?"":"string"===typeof a?a.replace(Kb," ").replace(wa,""):""},string:function(a){return da(a)?"":"string"===typeof a?a.replace(Kb, +" "):a}});g.extend(!0,p.ext.renderer,{header:{_:function(a,b,c,d){g(a.nTable).on("order.dt.DT",function(a,f,g,i){a=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(i[a]=="asc"?d.sSortAsc:i[a]=="desc"?d.sSortDesc:c.sSortingClass)})},jqueryui:function(a,b,c,d){var e=c.idx;g("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(g("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);g(a.nTable).on("order.dt.DT",function(a,g,i,j){b.removeClass(d.sSortAsc+ +" "+d.sSortDesc).addClass(j[e]=="asc"?d.sSortAsc:j[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(j[e]=="asc"?d.sSortJUIAsc:j[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)})}}});p.render={number:function(a,b,c,d){return{display:function(e){var e=parseFloat(e),f=parseInt(e,10),e=c?(b+(e-f).toFixed(c)).substring(2):"";return(d||"")+f.toString().replace(/\B(?=(\d{3})+(?!\d))/g, +a)+e}}}};g.extend(p.ext.internal,{_fnExternApiFunc:Jb,_fnBuildAjax:na,_fnAjaxUpdate:ib,_fnAjaxParameters:rb,_fnAjaxUpdateDraw:sb,_fnAjaxDataSrc:oa,_fnAddColumn:Aa,_fnColumnOptions:fa,_fnAdjustColumnSizing:U,_fnVisibleToColumnIndex:ga,_fnColumnIndexToVisible:X,_fnVisbleColumns:Y,_fnGetColumns:W,_fnColumnTypes:Da,_fnApplyColumnDefs:gb,_fnHungarianMap:S,_fnCamelToHungarian:G,_fnLanguageCompat:M,_fnBrowserDetect:eb,_fnAddData:H,_fnAddTr:ha,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==l?b._DT_RowIndex: +null},_fnNodeToColumnIndex:function(a,b,c){return g.inArray(c,a.aoData[b].anCells)},_fnGetCellData:A,_fnSetCellData:Ea,_fnSplitObjNotation:Ga,_fnGetObjectDataFn:T,_fnSetObjectDataFn:Ba,_fnGetDataMaster:Ha,_fnClearTable:ja,_fnDeleteIndex:ka,_fnInvalidateRow:la,_fnGetRowElements:ia,_fnCreateTr:Fa,_fnBuildHead:hb,_fnDrawHead:I,_fnDraw:J,_fnReDraw:K,_fnAddOptionsHtml:kb,_fnDetectHeader:$,_fnGetUniqueThs:ma,_fnFeatureHtmlFilter:mb,_fnFilterComplete:aa,_fnFilterCustom:vb,_fnFilterColumn:ub,_fnFilter:tb, +_fnFilterCreateSearch:Na,_fnEscapeRegex:Oa,_fnFilterData:wb,_fnFeatureHtmlInfo:pb,_fnUpdateInfo:xb,_fnInfoMacros:yb,_fnInitialise:ra,_fnInitComplete:pa,_fnLengthChange:Pa,_fnFeatureHtmlLength:lb,_fnFeatureHtmlPaginate:qb,_fnPageChange:Ra,_fnFeatureHtmlProcessing:nb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:ob,_fnScrollDraw:V,_fnApplyToChildren:F,_fnCalculateColumnWidths:Ca,_fnThrottle:Ma,_fnConvertToWidth:zb,_fnScrollingWidthAdjust:Bb,_fnGetWidestNode:Ab,_fnGetMaxLenString:Cb,_fnStringToCss:s,_fnScrollBarWidth:Db, +_fnSortFlatten:Q,_fnSort:jb,_fnSortAria:Fb,_fnSortListener:Sa,_fnSortAttachListener:Ka,_fnSortingClasses:sa,_fnSortData:Eb,_fnSaveState:ta,_fnLoadState:Gb,_fnSettingsFromNode:ua,_fnLog:O,_fnMap:D,_fnBindAction:Ta,_fnCallbackReg:y,_fnCallbackFire:t,_fnLengthOverflow:Qa,_fnRenderer:La,_fnDataSource:z,_fnRowAttributes:Ia,_fnCalculateEnd:function(){}});g.fn.dataTable=p;g.fn.dataTableSettings=p.settings;g.fn.dataTableExt=p.ext;g.fn.DataTable=function(a){return g(this).dataTable(a).api()};g.each(p,function(a, +b){g.fn.DataTable[a]=b});return g.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],M):"object"===typeof exports?M(require("jquery")):jQuery&&!jQuery.fn.dataTable&&M(jQuery)})(window,document); diff --git a/Public/images/aznyf.jpg b/Public/images/aznyf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b06c629accddd3d91b4dbff6a4f3fd5108beba5c GIT binary patch literal 42678 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 B8q@#) literal 0 HcmV?d00001 diff --git a/Public/images/bg.png b/Public/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..3c598b02ef705cd0e0d7bf5bc38a9f33b825dadb GIT binary patch literal 5932 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 b!zjG3#u0pez8$;#;RdLy>ZnvJ!z2F#-x?GU literal 0 HcmV?d00001 diff --git a/Public/images/icon/bingxiang.png b/Public/images/icon/bingxiang.png new file mode 100644 index 0000000000000000000000000000000000000000..3b0365657012cd54d9062e5f229b78c890b98863 GIT binary patch literal 3931 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/canzhuo.png b/Public/images/icon/canzhuo.png new file mode 100644 index 0000000000000000000000000000000000000000..44c0a7e83c418caf433d68721cd10d1985a5f402 GIT binary patch literal 5408 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 H9m4+y1njnW literal 0 HcmV?d00001 diff --git a/Public/images/icon/chuang.png b/Public/images/icon/chuang.png new file mode 100644 index 0000000000000000000000000000000000000000..904c599df531c840e11b7a090ae8149559e1733b GIT binary patch literal 6299 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/diannaozhuo.png b/Public/images/icon/diannaozhuo.png new file mode 100644 index 0000000000000000000000000000000000000000..6811751a779cf3dbc255b608154810fc88306b03 GIT binary patch literal 5585 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/dianshi.png b/Public/images/icon/dianshi.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc4cf7c4586522c33b81534a42bf263ab790a7d GIT binary patch literal 5447 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/dianti.png b/Public/images/icon/dianti.png new file mode 100644 index 0000000000000000000000000000000000000000..ad96432657814ae1a1d0e9dbae5384e306881134 GIT binary patch literal 6725 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/duwei.png b/Public/images/icon/duwei.png new file mode 100644 index 0000000000000000000000000000000000000000..3b8aee5e3a156a13007508997998be6c8e670642 GIT binary patch literal 6329 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 BWa|I` literal 0 HcmV?d00001 diff --git a/Public/images/icon/gongju.png b/Public/images/icon/gongju.png new file mode 100644 index 0000000000000000000000000000000000000000..16ea1b6b2a053d5b4d611fe3fddf70cbeec06a54 GIT binary patch literal 6089 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 U#6s#)zlZAvI;PssZ@5MN4=u>`r2qf` literal 0 HcmV?d00001 diff --git a/Public/images/icon/jiaju.png b/Public/images/icon/jiaju.png new file mode 100644 index 0000000000000000000000000000000000000000..90fbbb97e055f6317c32a5aa7ebfb6f33876c772 GIT binary patch literal 6252 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 YaNqx`;5;Ax`~KhD*xIPU@IvhW048+#fdBvi literal 0 HcmV?d00001 diff --git a/Public/images/icon/jianshenqicai.png b/Public/images/icon/jianshenqicai.png new file mode 100644 index 0000000000000000000000000000000000000000..0b28e1729803950222693a4e5c16896b5a954d2e GIT binary patch literal 6696 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/kezuofan.png b/Public/images/icon/kezuofan.png new file mode 100644 index 0000000000000000000000000000000000000000..026b7b87e8de6e22b81c60d8326e29b26c2ae867 GIT binary patch literal 6228 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 I2euLa1NDPUr~m)} literal 0 HcmV?d00001 diff --git a/Public/images/icon/kongtiao.png b/Public/images/icon/kongtiao.png new file mode 100644 index 0000000000000000000000000000000000000000..851b7ba433a0f2def244e6e3c88fda51ec231707 GIT binary patch literal 6434 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 G#Qy+&(6ze& literal 0 HcmV?d00001 diff --git a/Public/images/icon/kuandai.png b/Public/images/icon/kuandai.png new file mode 100644 index 0000000000000000000000000000000000000000..a80279722b715f7318e47a19517e651f89650985 GIT binary patch literal 6982 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/liangyijia.png b/Public/images/icon/liangyijia.png new file mode 100644 index 0000000000000000000000000000000000000000..66dd6f815ce1f76cf215b1c144c22008487c127e GIT binary patch literal 6502 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 S;d+1meCTN#Yt`O#!v7EKUcWa0 literal 0 HcmV?d00001 diff --git a/Public/images/icon/piaochuang.png b/Public/images/icon/piaochuang.png new file mode 100644 index 0000000000000000000000000000000000000000..18c6ccce6b9ad8e742012c12fa0f885a32a4b462 GIT binary patch literal 6559 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 Y*P*suYA8$l^UFj><DvQ+Rr~P&0}1mFa{vGU literal 0 HcmV?d00001 diff --git a/Public/images/icon/reshuiqi.png b/Public/images/icon/reshuiqi.png new file mode 100644 index 0000000000000000000000000000000000000000..dab244d06994668cd8316c925b11db7d974bc7eb GIT binary patch literal 5832 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 NHZim?!05Xt{10v_hXMcq literal 0 HcmV?d00001 diff --git a/Public/images/icon/shafa.png b/Public/images/icon/shafa.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ba3c2599b694609178ee2c011013848b63ec52 GIT binary patch literal 5946 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/weibolu.png b/Public/images/icon/weibolu.png new file mode 100644 index 0000000000000000000000000000000000000000..637f2b19ffe0b7f5fe133952c80ce1fc6cd96165 GIT binary patch literal 5750 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/xiyiji.png b/Public/images/icon/xiyiji.png new file mode 100644 index 0000000000000000000000000000000000000000..147d4bf12a0b3b07fc299553a34d230b9ecf5245 GIT binary patch literal 6357 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/yangtai.png b/Public/images/icon/yangtai.png new file mode 100644 index 0000000000000000000000000000000000000000..19e2ebb6506886fa32158c5f338c47d7222afa20 GIT binary patch literal 6830 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/yigui.png b/Public/images/icon/yigui.png new file mode 100644 index 0000000000000000000000000000000000000000..8d21a5d80be8e84d36105ae77fb9d296094d6bbe GIT binary patch literal 5634 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 literal 0 HcmV?d00001 diff --git a/Public/images/icon/yinxiang.png b/Public/images/icon/yinxiang.png new file mode 100644 index 0000000000000000000000000000000000000000..b2152fd215743ee0820375b7785a0c2c6e1c793d GIT binary patch literal 6859 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 MMO(Q>(Kh0L0O+84`Tzg` literal 0 HcmV?d00001 diff --git a/Public/images/icon/zhinengmensuo.png b/Public/images/icon/zhinengmensuo.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d66d928f869f152cf1a52d6d70963855961fb8 GIT binary patch literal 6172 zcmaJ_c|4Ts+aLQfGqPkaO}6Z2#y-}u?_}Szj4h09tb>H?3<{BDWZ$!d$Pz=S80FZa zGAOcSRHUd^=XcKey??yteLkP(x$o<~ukZI-|9P%7b5lJqBM&10000~4Yg?SH#lK&A z+OzM~UspNL7H*7=9mX=y3lrfM;t4>a0^L0!1_5r~o)(^NsHorxPZa=wO4!%R4r6Cx zjPM8ykaGL2BNZ7CbcO~1RMaDb+&ug|F%Wl8Z(p=3|EIn|euythmETs*1Zonb<>}+A zA06Up8EtCi5$)%pgyL6MgQ!Fz&IkfLF>a8^0Dp8SB2tzAPhP~?{`avoKjcppjGrq1 zf1I*2F^6achIm5cq~s($pl}#OK}iZGC#RqQmw>>bFj;9ROd2L52~$GI$|9gp$X^ft znY9p<7s5hY_b*##k}AIs1`~vkmX3&skcyCz3Jmd<hAAm2Nkie%aJb}|hGb|I8sioz zi4GO`n?c(%)FZ?<2;&=whWuu9a}Nx|sPdnA`kxR2g8rdJhyInOvxG@Ux&=wYq@ce; z`diV&<o{O<2>3@k6l3A}Uw{8k;!vxoAWvxv&(OfI5RbFMc?tYB6@<_V@pQukhFAp# z`v09pbDuy=V5m=E5JXGs¢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 literal 0 HcmV?d00001 diff --git a/Public/images/jsonFormater/Collapsed.gif b/Public/images/jsonFormater/Collapsed.gif new file mode 100644 index 0000000000000000000000000000000000000000..17cbc27b321c010dc7f8e118c3a9fdddd26aec9d GIT binary patch literal 215 zcmZ?wbhEHblwsgzIKsg2|NsAg|9=1Z^XJ>Quiw6Y`1tYd`wy=_et7xz&9j#;AHR5Z z<H3V_cW+(1dG++Q3&$><*?;Ebt__E-?BBcL(2nJ`vv(L98#90n0g_mO;!hSvb_Q_< z9gr-@P6pPH2daH3ne)P3*6N5Z+~C1j!W&@d!@1|E@Qyp3MjBCU?XCe4iv)B6G?Fz} yg{->XJ=H~1L}1#HMUGd~wx_LIba8`)+ytY~PK_RF6?^8a%vu{)+}NbZU=09HV`3Qq literal 0 HcmV?d00001 diff --git a/Public/images/jsonFormater/Expanded.gif b/Public/images/jsonFormater/Expanded.gif new file mode 100644 index 0000000000000000000000000000000000000000..2aa74410fc1d4b5ff2eddf807c2fea896858e81a GIT binary patch literal 206 zcmZ?wbhEHblwsgzIKsg2|NsAg|9=1Z^XJ>Quiw6Y`1tYd`wy=_et7xz&9j#;A3u0- z@9wROH*Q?KdG+-5%SWzVICkmG{xc_cZ8&sg|K1IUb}X-*y@LU42#~}I6o0ZXvNMP? z=zwHFb~3PfKTz#U$(%PmWNnV>!VM9OCA=YqF`SO~g?HRpX`~^>-?d;vh+@RN^Q}de pt3<dsT%0b>2+|j2UHq`XK`Aba)o9_4yDyin+FDin{)zyDH2~alU^@T+ literal 0 HcmV?d00001 diff --git a/Public/images/sort_asc.png b/Public/images/sort_asc.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ba61a8055fcb18273f2468d335572204667b1f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*bWaz@5R22v2@;zYta_*?F5u6Q zWR@in#&u+WgT?Hi<}D3B3<dtPKf3L(#%G;lkAsbPmH>}GOXuX|8Oj3tosHiJ3*4TN zC7>_x-r1O=t(?KoTC+`+>7&2GzdqLHBg&F)2Q?&EGZ+}|Rpsc~9`m>jw35No)z4*} HQ$iB}HK{Sd literal 0 HcmV?d00001 diff --git a/Public/images/sort_both.png b/Public/images/sort_both.png new file mode 100644 index 0000000000000000000000000000000000000000..af5bc7c5a10b9d6d57cb641aeec752428a07f0ca GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S0wixl{&NRX6FglULp08By<o`a;2_ZY@ahDQ zIZn@cq>cxyy87-Q;~nRxO8@-UU*I^KVWyN+&SiMHu5xDOu|HNvwzODfTdXjhVyNu1 z#7^XbGKZ7<gEZFeRPCMIsy$+yhaA3~(<<ARU4F{HcWVEZS94u?w%>LW3XeONb<yeJ z>$RKLeE*WhqbYpIXPIqK@r4)v+qN8um%99%MPpS9d#7Ed7SL@Bp00i_>zopr0H-Zb Aj{pDw literal 0 HcmV?d00001 diff --git a/Public/images/sort_desc.png b/Public/images/sort_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..0e156deb5f61d18f9e2ec5da4f6a8c94a5b4fb41 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*R8JSj5R22v2@<S}6GRp?u4>yo z(czD9$NuDl3Ljm9c#_#4$vXUz=f1~&WY3aa=h!;z7fOEN>ySP9QA=6C-^Dmb&tuM= z4Z&=WZU;2WF>e%GI&mWJk^K!jrbro{W;-I>FeCfLGJl3}+Z^2)3Kw?+EoAU?^>bP0 Hl+XkKC^<KP literal 0 HcmV?d00001 diff --git a/Public/js/cms.js b/Public/js/cms.js new file mode 100644 index 0000000..6eafde2 --- /dev/null +++ b/Public/js/cms.js @@ -0,0 +1,149 @@ +layui.define(['layer','element', 'forTree'], function(exports) { + var layer = layui.layer; + var element = layui.element(); + var forTree = layui.forTree; + var $ = layui.jquery; + + var nav = null; + var tab = null; + var tabContent = null; + var tabTitle = null; + var navFilter = null; + var tabFilter = null; + + /** + * 添加导航 + */ + function addNav(data, topId, idName, pidName, nodeName, urlName) { + topId = topId || 0; + idName = idName || 'id'; + pidName = pidName || 'pid'; + nodeName = nodeName || 'node'; + urlName = urlName || 'url'; + + var myTree = new forTree(data, idName, pidName, topId); + var html = ''; + + myTree.forBefore = function (v, k, hasChildren) { + html += '<li class="layui-nav-item">'; + }; + + myTree.forCurr = function(v, k, hasChildren) { + html += '<a href="javascript:;"'+(v[urlName] ? ' data-url="'+v[urlName]+'" data-id="'+v[idName]+'"' : '')+'>'; + html += v[nodeName]; + html += '</a>'; + }; + + myTree.callBefore = function (v, k) { + html += '<ul class="layui-nav-child">'; + }; + + myTree.callAfter = function (v, k) { + html += '</ul>'; + }; + + myTree.forAfter = function (v, k, hasChildren) { + html += '</li>'; + }; + + myTree.each(); + + nav.append(html); + + element.init('nav('+navFilter+')'); + } + + /** + * 将侧边栏与顶部切换卡进行绑定 + */ + function bind(height) { + + height = height || 60 + 41 + 44; //头部高度 顶部切换卡标题高度 底部高度 + /** + * iframe自适应 + */ + $(window).resize(function() { + //设置顶部切换卡容器度 + tabContent.height($(this).height() - height); + //设置顶部切换卡容器内每个iframe高度 + tabContent.find('iframe').each(function () { + $(this).height(tabContent.height()); + }); + }).resize(); + + /** + * 监听侧边栏导航点击事件 + */ + element.on('nav('+navFilter+')', function(elem) { + var a = elem.children('a'); + var title = a.text(); + var src = elem.children('a').attr('data-url'); + var id = elem.children('a').attr('data-id'); + var frame = tabContent.find('iframe[data-id='+id+']').eq(0); + var tabIndex = (new Date()).getTime(); + + if(src != undefined && src != null && id != undefined && id != null) { + if(frame.length) { //存在 iframe + //获取iframe身上的tab index + tabIndex = frame.attr('data-tabindex'); + }else{ //不存在 iframe + //显示加载层 + var tmpIndex = layer.load(); + //设置1秒后再次关闭loading + setTimeout(function() { + layer.close(tmpIndex); + }, 1000); + //拼接iframe + var newFrame = '<iframe onload="layui.layer.close('+tmpIndex+')"'; + newFrame += ' src="'+src+'" data-id="'+id+'" data-tabindex="'+tabIndex+'"'; + newFrame += ' style="width: 100%; height: '+tabContent.height()+'px; border: 0px;"'; + newFrame += '></iframe>'; + //顶部切换卡新增一个卡片 + element.tabAdd(tabFilter, {title: title, content: newFrame, id: 'index-'+tabIndex}); + } + + //切换到指定索引的卡片 + element.tabChange(tabFilter, 'index-'+tabIndex); + + //隐藏第一个切换卡的删除按钮 + tabTitle.find('li').eq(0).find('i').hide(); + } + }); + } + + /** + * 根据索引点击导航栏的某个li + */ + function clickLI(index) { + nav.find('li').eq(index || 0).click(); + } + + /** + * 导出接口 + */ + exports('cms', function(navLayFilter, tabLayFilter) { + navFilter = navLayFilter; + tabFilter = tabLayFilter; + + nav = $('.layui-nav[lay-filter='+navFilter+']').eq(0); + tab = $('.layui-tab[lay-filter='+tabFilter+']').eq(0); + tabContent = tab.children('.layui-tab-content').eq(0); + tabTitle = tab.children('.layui-tab-title').eq(0); + + var error = ''; + if(nav.length == 0) { + error += '没有找到导航栏<br>'; + } + + if(tab.length == 0) { + error += '没有找到切换卡<br>'; + } + + if(error) { + layer.msg('cms模块初始化失败!<br>' + error); + return false; + } + + return {addNav: addNav, bind: bind, clickLI: clickLI}; + }); +}); \ No newline at end of file diff --git a/Public/js/forTree.js b/Public/js/forTree.js new file mode 100644 index 0000000..9886a18 --- /dev/null +++ b/Public/js/forTree.js @@ -0,0 +1,85 @@ +/** + * 递归遍历树形类 + */ +layui.define(function(exports) { + /** + * 导出接口 + */ + exports('forTree', function (arr, idName, pidName, topId) { + var _that = this; //对象本身 + var _father = []; //所有顶级节点 + var _children = []; //所有子节点 + var _idName = idName || 'id'; //id名称 + var _pidName = pidName || 'pid'; //父id名称 + var _topId = topId || 0; //顶级节点父id + + for(var i in arr) { + if(arr[i][_pidName] == _topId) { + _father.push(arr[i]); + }else{ + _children.push(arr[i]); + } + } + + /** + * 循环之前回调 + */ + this.forBefore = function(v, k, hasChildren) {}; + /** + * 循环时回调 + */ + this.forCurr = function(v, k, hasChildren) {}; + /** + * 递归之前回调 + */ + this.callBefore = function(v, k) {}; + /** + * 递归之后回调 + */ + this.callAfter = function(v, k) {}; + /** + * 循环之后回调 + */ + this.forAfter = function(v, k, hasChildren) {}; + + /** + * 获取某个节点的一级子节点 + */ + this.getChildren = function(id) { + var son = []; + + for(var i in _children) { + if(_children[i][_pidName] == id) { + son.push(_children[i]); + } + } + + return son; + }; + + /** + * 开始循环 + */ + this.each = function(arr) { + if(arr == undefined) { + arr = _father; + } + + for(var i in arr) { + var children = _that.getChildren(arr[i][_idName]); + var counter = children.length; + + _that.forBefore(arr[i], i, counter); + _that.forCurr(arr[i], i, counter); + + if(counter) { + _that.callBefore(arr[i], i); + _that.each(children); + _that.callAfter(arr[i], i); + } + + _that.forAfter(arr[i], i, counter); + } + } + }); +}); \ No newline at end of file diff --git a/Public/jsonFormater/jsonFormater.css b/Public/jsonFormater/jsonFormater.css new file mode 100644 index 0000000..79c6909 --- /dev/null +++ b/Public/jsonFormater/jsonFormater.css @@ -0,0 +1,35 @@ +@charset "utf-8"; +/* CSS Document */ +.jf-ObjectBrace { + color: #00AA00; + font-weight: bold; +} +.jf-ArrayBrace { + color: #0033FF; + font-weight: bold; +} +.jf-PropertyName { + color: #CC0000; + font-weight: bold; +} +.jf-String { + color: #007777; +} +.jf-Number { + color: #AA00AA; +} +.jf-Boolean { + color: #0000FF; +} +.jf-Null { + color: #0000FF; +} +.jf-Comma { + color: #000000; + font-weight: bold; +} +pre.jf-CodeContainer { + margin-top: 0; + margin-bottom: 0; + text-align: left; +} diff --git a/Public/jsonFormater/jsonFormater.js b/Public/jsonFormater/jsonFormater.js new file mode 100644 index 0000000..f6995b3 --- /dev/null +++ b/Public/jsonFormater/jsonFormater.js @@ -0,0 +1,202 @@ +function JsonFormater(opt) { + this.options = $.extend({ + dom: '', + tabSize: 2, + singleTab: " ", + quoteKeys: true, + imgCollapsed: "images/Collapsed.gif", + imgExpanded: "images/Expanded.gif", + isCollapsible: true + }, opt || {}); + this.isFormated = false; + this.obj = { + _dateObj: new Date(), + _regexpObj: new RegExp() + }; + this.init(); +} +JsonFormater.prototype = { + init: function () { + this.tab = this.multiplyString(this.options.tabSize, this.options.singleTab); + this.bindEvent(); + }, + doFormat: function (json) { + var html; + var obj; + try { + if(typeof json == 'object'){ + obj = [json]; + }else{ + if (json == ""){ + json = "\"\""; + } + obj = eval("[" + json + "]"); + } + html = this.ProcessObject(obj[0], 0, false, false, false); + $(this.options.dom).addClass('jf-CodeContainer'); + $(this.options.dom).html(html); + this.isFormated = true; + } catch (e) { + alert("JSON数据格式不正确:\n" + e.message); + $(this.options.dom).html(""); + this.isFormated = false; + } + }, + bindEvent: function () { + var that = this; + $(this.options.dom).off('click','.imgToggle'); + $(this.options.dom).on('click', '.imgToggle', function () { + if (that.isFormated == false) { + return; + } + that.makeContentVisible($(this).parent().next(), !$(this).data('status')); + }); + }, + expandAll: function () { + if (this.isFormated == false) { + return; + } + var that = this; + this.traverseChildren($(this.options.dom), function(element){ + if(element.hasClass('jf-collapsible')){ + that.makeContentVisible(element, true); + } + }, 0); + }, + collapseAll: function () { + if (this.isFormated == false) { + return; + } + var that = this; + this.traverseChildren($(this.options.dom), function(element){ + if(element.hasClass('jf-collapsible')){ + that.makeContentVisible(element, false); + } + }, 0); + }, + collapseLevel: function(level){ + if (this.isFormated == false) { + return; + } + var that = this; + this.traverseChildren($(this.options.dom), function(element, depth){ + if(element.hasClass('jf-collapsible')){ + if(depth >= level){ + that.makeContentVisible(element, false); + }else{ + that.makeContentVisible(element, true); + } + } + }, 0); + + }, + isArray: function (obj) { + return obj && + typeof obj === 'object' && + typeof obj.length === 'number' && !(obj.propertyIsEnumerable('length')); + }, + getRow: function (indent, data, isPropertyContent) { + var tabs = ""; + if (!isPropertyContent) { + tabs = this.multiplyString(indent, this.tab); + } + if (data != null && data.length > 0 && data.charAt(data.length - 1) != "\n") { + data = data + "\n"; + } + return tabs + data; + }, + formatLiteral: function (literal, quote, comma, indent, isArray, style) { + if (typeof literal == 'string') { + literal = literal.split("<").join("<").split(">").join(">"); + } + var str = "<span class='jf-" + style + "'>" + quote + literal + quote + comma + "</span>"; + if (isArray) str = this.getRow(indent, str); + return str; + }, + formatFunction: function (indent, obj) { + var tabs; + var i; + var funcStrArray = obj.toString().split("\n"); + var str = ""; + tabs = this.multiplyString(indent, this.tab); + for (i = 0; i < funcStrArray.length; i++) { + str += ((i == 0) ? "" : tabs) + funcStrArray[i] + "\n"; + } + return str; + }, + multiplyString: function (num, str) { + var result = ''; + for (var i = 0; i < num; i++) { + result += str; + } + return result; + }, + traverseChildren: function (element, func, depth) { + var length = element.children().length; + for (var i = 0; i < length; i++) { + this.traverseChildren(element.children().eq(i), func, depth + 1); + } + func(element, depth); + }, + makeContentVisible : function(element, visible){ + var img = element.prev().find('img'); + if(visible){ + element.show(); + img.attr('src', this.options.imgExpanded); + img.data('status', 1); + }else{ + element.hide(); + img.attr('src', this.options.imgCollapsed); + img.data('status', 0); + } + }, + ProcessObject: function (obj, indent, addComma, isArray, isPropertyContent) { + var html = ""; + var comma = (addComma) ? "<span class='jf-Comma'>,</span> " : ""; + var type = typeof obj; + var clpsHtml = ""; + var prop; + if (this.isArray(obj)) { + if (obj.length == 0) { + html += this.getRow(indent, "<span class='jf-ArrayBrace'>[ ]</span>" + comma, isPropertyContent); + } else { + clpsHtml = this.options.isCollapsible ? "<span><img class='imgToggle' data-status='1' src='" + this.options.imgExpanded + "'/></span><span class='jf-collapsible'>" : ""; + html += this.getRow(indent, "<span class='jf-ArrayBrace'>[</span>" + clpsHtml, isPropertyContent); + for (var i = 0; i < obj.length; i++) { + html += this.ProcessObject(obj[i], indent + 1, i < (obj.length - 1), true, false); + } + clpsHtml = this.options.isCollapsible ? "</span>" : ""; + html += this.getRow(indent, clpsHtml + "<span class='jf-ArrayBrace'>]</span>" + comma); + } + } else if (type == 'object') { + if (obj == null) { + html += this.formatLiteral("null", "", comma, indent, isArray, "Null"); + } else { + var numProps = 0; + for (prop in obj) numProps++; + if (numProps == 0) { + html += this.getRow(indent, "<span class='jf-ObjectBrace'>{ }</span>" + comma, isPropertyContent); + } else { + clpsHtml = this.options.isCollapsible ? "<span><img class='imgToggle' data-status='1' src='" + this.options.imgExpanded + "'/></span><span class='jf-collapsible'>" : ""; + html += this.getRow(indent, "<span class='jf-ObjectBrace'>{</span>" + clpsHtml, isPropertyContent); + var j = 0; + for (prop in obj) { + var quote = this.options.quoteKeys ? "\"" : ""; + html += this.getRow(indent + 1, "<span class='jf-PropertyName'>" + quote + prop + quote + "</span>: " + this.ProcessObject(obj[prop], indent + 1, ++j < numProps, false, true)); + } + clpsHtml = this.options.isCollapsible ? "</span>" : ""; + html += this.getRow(indent, clpsHtml + "<span class='jf-ObjectBrace'>}</span>" + comma); + } + } + } else if (type == 'number') { + html += this.formatLiteral(obj, "", comma, indent, isArray, "Number"); + } else if (type == 'boolean') { + html += this.formatLiteral(obj, "", comma, indent, isArray, "Boolean"); + }else if (type == 'undefined') { + html += this.formatLiteral("undefined", "", comma, indent, isArray, "Null"); + } else { + html += this.formatLiteral(obj.toString().split("\\").join("\\\\").split('"').join('\\"'), "\"", comma, indent, isArray, "String"); + } + return html; + } +}; diff --git a/Public/layui/css/layui.css b/Public/layui/css/layui.css new file mode 100644 index 0000000..4460840 --- /dev/null +++ b/Public/layui/css/layui.css @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + .layui-laypage a,a{text-decoration:none}.layui-btn,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}.layui-btn,.layui-tree li i,.layui-unselect{-moz-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3{font-size:14px;font-weight:400}h4,h5,h6{font-size:100%;font-weight:400}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-button:vertical{display:none}::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background-color:#e2e2e2}::-webkit-scrollbar-thumb{border-radius:0;background-color:rgba(0,0,0,.3)}::-webkit-scrollbar-thumb:vertical:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar-thumb:vertical:active{background-color:rgba(0,0,0,.38)}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.9);src:url(../font/iconfont.eot?v=1.0.9#iefix) format('embedded-opentype'),url(../font/iconfont.svg?v=1.0.9#iconfont) format('svg'),url(../font/iconfont.woff?v=1.0.9) format('woff'),url(../font/iconfont.ttf?v=1.0.9) format('truetype')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;background-color:#e2e2e2;clear:both}a{color:#333}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge{position:absolute;width:0;height:0;border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-main{position:relative;width:1140px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;background-color:#eee}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-transition:border-color .3s cubic-bezier(.65,.05,.35,.5);transition:border-color .3s cubic-bezier(.65,.05,.35,.5);-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.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-color:#e2e2e2;border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border:1px solid #e2e2e2}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border:none;border-top:1px solid #e2e2e2}.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;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:-18px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border:1px solid #e2e2e2;border-radius:2px}.layui-colla-item{border-top:1px solid #e2e2e2}.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}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;border-top:1px solid #e2e2e2;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-bg-red{background-color:#FF5722}.layui-bg-orange{background-color:#F7B824}.layui-bg-green{background-color:#009688}.layui-bg-cyan{background-color:#2F4056}.layui-bg-blue{background-color:#1E9FFF}.layui-bg-black{background-color:#393D49}.layui-bg-gray{background-color:#eee}.layui-word-aux{font-size:12px;color:#999;padding:0 5px}.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;opacity:.9;filter:alpha(opacity=90)}.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-radius{border-radius:100px}.layui-btn .layui-icon{font-size:18px;vertical-align:bottom}.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:#F7B824}.layui-btn-danger{background-color:#FF5722}.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-big{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-small{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-small i{font-size:16px!important}.layui-btn-mini{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-mini 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-input,.layui-select,.layui-textarea{height:38px;line-height:38px;line-height:36px\9;border:1px solid #e6e6e6;background-color:#fff;border-radius:2px}.layui-form-label,.layui-form-mid,.layui-textarea{line-height:20px;position:relative}.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;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-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:80px;font-weight:400;text-align:right}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;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:8px 0;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border:1px solid #FF5722!important}.layui-form-select{position:relative}.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: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}.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}.layui-form-select .layui-select-group dd{padding-left:20px}.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-radio,.layui-form-radio *,.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-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:28px;margin:4px 10px 0 0;padding-right:30px;border:1px solid #d2d2d2;cursor:pointer;font-size:0;border-radius:2px;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box!important}.layui-form-checkbox:hover{border:1px solid #c2c2c2}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;width:30px;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{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-checkbox[lay-skin=primary]{margin-top:6px;border:none!important;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{float:right;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{position:relative;top:0;width: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;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-switch{position:relative;height:22px;line-height:22px;width:42px;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:absolute;right:5px;top:0;width:25px;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-form-onswitch i{left:32px;background-color:#fff}.layui-form-onswitch em{left:5px;right:auto;color:#fff!important}.layui-checkbox-disbaled{border-color:#e2e2e2!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio span{font-size:14px}.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:1px solid #e6e6e6;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.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-right:1px solid #e6e6e6;border-radius:2px;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;text-align:left}.layui-laypage button,.layui-laypage input,.layui-nav{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important}.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:1px solid #e6e6e6}.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}.layui-layedit{border:1px solid #d2d2d2;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom:1px solid #e2e2e2;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-table{width:100%;margin:10px 0;background-color:#fff}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table thead tr{background-color:#f2f2f2}.layui-table th{text-align:left}.layui-table td,.layui-table th{padding:9px 15px;min-height:20px;line-height:20px;border:1px solid #e2e2e2;font-size:14px}.layui-table tr:hover,.layui-table[lay-even] tr:nth-child(even){background-color:#f8f8f8}.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border:1px solid #e2e2e2}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border:none;border-bottom:1px solid #e2e2e2}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border:none;border-right:1px solid #e2e2e2}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-upload-button{position:relative;display:inline-block;vertical-align:middle;min-width:60px;height:38px;line-height:38px;border:1px solid #DFDFDF;border-radius:2px;overflow:hidden;background-color:#fff;color:#666}.layui-upload-button:hover{border:1px solid #aaa;color:#333}.layui-upload-button:active{border:1px solid #4CAF50;color:#000}.layui-upload-button input,.layui-upload-file{opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-upload-button input{position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%}.layui-upload-icon{display:block;margin:0 15px;text-align:center}.layui-upload-icon i{margin-right:5px;vertical-align:top;font-size:20px;color:#5FB878}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}.layui-upload-enter .layui-upload-icon,.layui-upload-enter .layui-upload-icon i{color:#fff}.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 *{display:inline-block;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-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>:first-child,.layui-laypage>:first-child em{border-radius:2px 0 0 2px}.layui-laypage>:last-child,.layui-laypage>:last-child em{border-radius:0 2px 2px 0}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;border:1px solid #e2e2e2;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage em{font-style:normal}.layui-laypage span{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff;font-weight:400}.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-total{height:30px;line-height:30px;margin-left:1px;border:none;font-weight:400}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border:1px solid #e2e2e2;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box!important}.layui-laypage input{width:50px;margin:0 5px;text-align:center}.layui-laypage button{margin-left:5px;padding:0 15px;cursor:pointer}.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-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#c2c2c2;border-radius:2px;font-size:0;box-sizing:border-box!important}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#c2c2c2;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 .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#c2c2c2 transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:28px;right:3px;border-width:6px}.layui-nav .layui-nav-mored,.layui-nav-itemed .layui-nav-more{top:22px;border-style:dashed dashed solid;border-color:transparent transparent #c2c2c2}.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:#333}.layui-nav-child dd{position:relative}.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this a{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{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-child dd.layui-this,.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{background-color:#2B2E37!important;color:#fff!important}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.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:#c2c2c2}.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{top:20px;right:10px}.layui-nav-itemed .layui-nav-more{top:14px}.layui-nav-itemed .layui-nav-child{display:block;padding:0}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb a{padding-right:8px;line-height:22px;font-size:14px;color:#333!important}.layui-breadcrumb a:hover{color:#01AAED!important}.layui-breadcrumb a cite,.layui-breadcrumb a span{color:#666;cursor:text;font-style:normal}.layui-breadcrumb a span{padding-left:8px;font-family:Sim sun}.layui-tab{margin:10px 0;text-align:left!important}.layui-fixbar li,.layui-tab-bar,.layui-tab-title li,.layui-util-face ul li{cursor:pointer;text-align:center}.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:1px solid #e2e2e2;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 10px}.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:1px solid #e2e2e2;border-bottom-color:#fff;border-radius:2px 2px 0 0;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border:1px solid #e2e2e2;border-radius:2px;background-color:#fff}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item,.layui-util-face .layui-layer-TipsG{display:none}.layui-tab-more{padding-right:30px;height:auto;white-space:normal}.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;margin-left:8px;top:1px;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:3px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border:1px solid #e2e2e2;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-fixbar{position:fixed;right:15px;bottom:15px;z-index:9999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;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 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{float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-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;-ms-transform:scale(.5);transform:scale(.5)}80%{opacity:.8;-ms-transform:scale(1.1);transform:scale(1.1)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@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}} \ No newline at end of file diff --git a/Public/layui/css/layui.mobile.css b/Public/layui/css/layui.mobile.css new file mode 100644 index 0000000..06aa5f6 --- /dev/null +++ b/Public/layui/css/layui.mobile.css @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/Public/layui/css/modules/code.css b/Public/layui/css/modules/code.css new file mode 100644 index 0000000..704b8f3 --- /dev/null +++ b/Public/layui/css/modules/code.css @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:30px;line-height:30px;border-bottom:1px solid #ddd}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #ddd;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} \ No newline at end of file diff --git a/Public/layui/css/modules/laydate/icon.png b/Public/layui/css/modules/laydate/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5a50673e0975b2bbc35c0e11d4848adcc1fb4dce GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoL!3HEBKfAITNU;<<d4_NRK@CSr2awNM;1OBO zz`!j8!i<;h*8Kqrij}xVlsFfqCYEI8=P86_=B6?jnCTmu>KmG59{tw<R3QUW5uBe^ zQl40p%HWuipOmWLmRXcqo?nz*tl%7MTDbMG8BpCMPZ!4!i{87FPYWJU;BfIgwk+qw zA{`E{4GYem^l|zyz2H<_N#O@g9%<v|IiksXe%_T%cxgYu;mewb;+-A5nX>Cv{ftOs zW4N;Q)!OTY3>;>=*3S97Q-7&|V4&B^*_(MTPLEp{EO2-FMERq>C$<(UCH;z0ntPpj zuhw;+PCLge`!D{>6<6ENoV!-|k>yvlBgwa_tr*1kXQoW_{Rng%1B0ilpUXO@geCxM C4sr(o literal 0 HcmV?d00001 diff --git a/Public/layui/css/modules/laydate/laydate.css b/Public/layui/css/modules/laydate/laydate.css new file mode 100644 index 0000000..c0eec2f --- /dev/null +++ b/Public/layui/css/modules/laydate/laydate.css @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + #layuicss-laydatecss{display:none;position:absolute;width:1989px}.laydate_body .laydate_box,.laydate_body .laydate_box *{margin:0;padding:0;box-sizing:content-box}.laydate-icon,.laydate-icon-dahong,.laydate-icon-danlan,.laydate-icon-default,.laydate-icon-molv{height:22px;line-height:22px;padding-right:20px;border:1px solid #C6C6C6;background-repeat:no-repeat;background-position:right center;background-color:#fff;outline:0}.laydate-icon-default{background-image:url(../skins/default/icon.png)}.laydate-icon-danlan{border:1px solid #B1D2EC;background-image:url(../skins/danlan/icon.png)}.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}.laydate_body .laydate_box{width:240px;font:12px '\5B8B\4F53';z-index:99999999;*overflow:hidden;_margin:0;_position:absolute!important}.laydate_body .laydate_box li{list-style:none}.laydate_body .laydate_box .laydate_void{cursor:text!important}.laydate_body .laydate_box cite,.laydate_body .laydate_box label{position:absolute;width:0;height:0;border-width:5px;border-style:dashed;border-color:transparent;overflow:hidden;cursor:pointer}.laydate_body .laydate_box .laydate_time,.laydate_body .laydate_box .laydate_yms{display:none}.laydate_body .laydate_box .laydate_show{display:block}.laydate_body .laydate_box input{outline:0;font-size:14px;background-color:#fff;color:#333}.laydate_body .laydate_top{position:relative;height:26px;padding:5px;*width:100%;z-index:99}.laydate_body .laydate_ym{position:relative;float:left;height:24px;cursor:pointer}.laydate_body .laydate_ym input{float:left;height:24px;line-height:24px;text-align:center;border:none;cursor:pointer}.laydate_body .laydate_ym .laydate_yms{position:absolute;left:-1px;top:24px;height:181px}.laydate_body .laydate_y{width:121px;margin-right:6px}.laydate_body .laydate_y input{width:64px;margin-right:15px}.laydate_body .laydate_y .laydate_yms{width:121px;text-align:center}.laydate_body .laydate_y .laydate_yms a{position:relative;display:block;height:20px}.laydate_body .laydate_y .laydate_yms ul{height:139px;padding:0;*overflow:hidden}.laydate_body .laydate_y .laydate_yms ul li{float:left;width:60px;height:20px;line-height:20px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate_body .laydate_m{width:99px}.laydate_body .laydate_m .laydate_yms{width:99px;padding:0}.laydate_body .laydate_m input{width:42px;margin-right:15px}.laydate_body .laydate_m .laydate_yms span{display:block;float:left;width:42px;margin:5px 0 0 5px;line-height:24px;text-align:center;_display:inline}.laydate_body .laydate_choose{display:block;float:left;position:relative;width:20px;height:24px}.laydate_body .laydate_choose cite,.laydate_body .laydate_tab cite{left:50%;top:50%}.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px;border-bottom-style:solid}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{top:50%;margin:-2px 0 0 -5px;border-top-style:solid}.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px}.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px}.laydate_body .laydate_ym label{right:28px}.laydate_body .laydate_table{width:230px;margin:0 5px;border-collapse:collapse;border-spacing:0}.laydate_body .laydate_table td{width:31px;text-align:center;cursor:pointer;font-size:12px}.laydate_body .laydate_table thead th{font-weight:400;font-size:12px;text-align:center}.laydate_body .laydate_bottom{position:relative;height:22px;line-height:20px;padding:5px;font-size:12px}.laydate_body .laydate_bottom #laydate_hms{position:relative;z-index:1;float:left}.laydate_body .laydate_time{position:absolute;left:5px;bottom:26px;width:129px;height:125px;*overflow:hidden}.laydate_body .laydate_time .laydate_hmsno{padding:5px 0 0 5px}.laydate_body .laydate_time .laydate_hmsno span{display:block;float:left;width:24px;height:19px;line-height:19px;text-align:center;cursor:pointer;*margin-bottom:-5px}.laydate_body .laydate_time1{width:228px;height:154px}.laydate_body .laydate_time1 .laydate_hmsno{padding:6px 0 0 8px}.laydate_body .laydate_time1 .laydate_hmsno span{width:21px;height:20px;line-height:20px}.laydate_body .laydate_msg{left:49px;bottom:67px;width:141px;height:auto;overflow:hidden}.laydate_body .laydate_msg p{padding:5px 10px}.laydate_body .laydate_bottom li{float:left;height:20px;line-height:20px;border-right:none;font-weight:900}.laydate_body .laydate_bottom .laydate_sj{width:33px;text-align:center;font-weight:400}.laydate_body .laydate_bottom input{float:left;width:21px;height:20px;line-height:20px;border:none;text-align:center;cursor:pointer;font-size:12px;font-weight:400}.laydate_body .laydate_bottom .laydte_hsmtex{height:20px;line-height:20px;text-align:center}.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute;width:20px;top:0;right:0;cursor:pointer}.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px}.laydate_body .laydate_bottom .laydate_btn{position:absolute;right:5px;top:5px}.laydate_body .laydate_bottom .laydate_btn a{float:left;height:20px;padding:0 6px;_padding:0 5px}.laydate_body .laydate_table td,.laydate_body .laydate_table thead{height:21px!important;line-height:21px!important}.laydate-icon{border:1px solid #C6C6C6;background-image:url(icon.png)}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_bottom .laydate_btn a,.laydate_body .laydate_box,.laydate_body .laydate_table,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_ym,.laydate_body .laydate_ym .laydate_yms{border:1px solid #ccc}.laydate_body .laydate_bottom .laydte_hsmtex,.laydate_body .laydate_choose,.laydate_body .laydate_table thead,.laydate_body .laydate_y .laydate_yms a{background-color:#F6F6F6}.laydate_body .laydate_box,.laydate_body .laydate_time,.laydate_body .laydate_ym .laydate_yms{box-shadow:2px 2px 5px rgba(0,0,0,.1)}.laydate_body .laydate_box{border-top:none;border-bottom:none;background-color:#fff;color:#333}.laydate_body .laydate_box .laydate_void{color:#ccc!important}.laydate_body .laydate_box .laydate_void:hover{background-color:#fff!important}.laydate_body .laydate_box a,.laydate_body .laydate_box a:hover{text-decoration:none;blr:expression(this.onFocus=this.blur());cursor:pointer;color:#333}.laydate_body .laydate_box a:hover{text-decoration:none;color:#666}.laydate_body .laydate_click{background-color:#eee!important}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_choose:hover,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_y .laydate_yms a:hover{background-color:#fff}.laydate_body .laydate_top{border-top:1px solid #C6C6C6}.laydate_body .laydate_ym .laydate_yms{border:1px solid #C6C6C6;background-color:#fff}.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #C6C6C6;border-bottom:none}.laydate_body .laydate_choose{border-left:1px solid #C6C6C6}.laydate_body .laydate_chprev{border-left:none;border-right:1px solid #C6C6C6}.laydate_body .laydate_chtop cite{border-bottom-color:#666}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{border-top-color:#666}.laydate_body .laydate_chprev cite{border-right-style:solid;border-right-color:#666}.laydate_body .laydate_chnext cite{border-left-style:solid;border-left-color:#666}.laydate_body .laydate_table td{border:none}.laydate_body .laydate_table .laydate_nothis{color:#999}.laydate_body .laydate_table thead th{border-bottom:1px solid #ccc}.laydate_body .laydate_bottom,.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_sj{border-right:1px solid #C6C6C6;background-color:#F6F6F6}.laydate_body .laydate_bottom input{background-color:#fff}.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_v{position:absolute;left:10px;top:6px;font-family:Courier;z-index:0;color:#999}.laydate_body .laydate_bottom .laydate_btn a{border-right:none;background-color:#F6F6F6}.laydate_body .laydate_bottom .laydate_btn a:hover{color:#000;background-color:#fff}.laydate_body .laydate_m .laydate_yms span:hover,.laydate_body .laydate_table td:hover,.laydate_body .laydate_time .laydate_hmsno span:hover,.laydate_body .laydate_y .laydate_yms ul li:hover{background-color:#F3F3F3} \ No newline at end of file diff --git a/Public/layui/css/modules/layer/default/icon-ext.png b/Public/layui/css/modules/layer/default/icon-ext.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbb669bb311514baa5db3a6a00b4644d0e280f1 GIT binary patch literal 5911 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 YZmOLxGt_1UThtH@6<y_WCF{ul0LuG;00000 literal 0 HcmV?d00001 diff --git a/Public/layui/css/modules/layer/default/icon.png b/Public/layui/css/modules/layer/default/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3e17da8b1aaae2935e19ac97d9015f0fe24e8770 GIT binary patch literal 11493 zcmXwf1y~!;7j2Lt#i6)cp}4!dy9B4WyL*ef7I!ZWMS_*$?jEeTOMv3?@_X<9@_ot9 z&dyGDXU^Pv?zt1KrXq{>k?11;06>$MlhS}5=b&F<Bn0U1N-Qrf^Z@TJA+Lo5{RALc zL_yDyUF7uK0RR;2|GqGD8$mD7N)iugpogZjm529NH%oxHg|nF@g^aD6rMI)2y*q`Z zCeKk<Qyc(50g#sx*Ye3d&+`p1Sj@Wbxwrd8Gj88S!;_FFta8RAMnOZ#gp8&}Zy;xr z)tVFmTb8F{n>E!8cRn$r(cw*CLxiM=BH4${Ax7y;K}kc|Yw?S8cxq>*aTjQ8v6{l9 zH@7H!N#68nTt6@Ke%^biXL^`i@jn0X<)XWz$A8Lq$~~VEnG#-}VqFJzNf^EZy%>C= zMyiaYN(V?`C+9Cg<@d(R?s~NOh)<dIF;zPYd&+O)?5ss&aalTkd}uTXF;4^o@aRXa zIYFpZe%M68nOLS5uEdrp6Rz8`cD1<pSJW4^tSmaD1+AqGAHdIuqWl#LoWkLuSzc10 z9i5ve$k5g2ogQLNS5^IS(I`~F1$&#kYpNq)uldVJxx(J<2OExbs$;sikM;fAg+G5r zr>Eo9=rHo+pjFHxhYXrg^73Z%^+_lwD9|%9Qd3i#YxykZI|Z~vLdZp9dfJo4{E6+H zF#v8l=-CkIBL%vW9G!&UW-M+~AocB*r{|SjyFIaBPFZ1V{{8cEP2_y%-%EWo{d{Bb zIG`27vEtj&PbVCyOJ8WQQ|z3@Z2eHm9*q|AOTLhn=4vLi-pVvvwozD5%Rv^X)R&#D zHDz&f1ap3R-j!NtejVLjdeOLGqBl?Hf9~@6u{4i*wh`TChcR|sp61YuGtR~Ylmhpa z*|28&7<W~5q7Sx4i%nZCyn)jkEZje2=Nil&Y(_g|dm49<l9DbgEU4+~%KH2JEAZ?N zCt5Gn=xOQbXsD^V7<VZs;=pybayHzXryUGIyDm$WH}IjgRjd;?(C{+uLW9%UY$D&w z+ayZxn<}@^bjtmM|BIoW)?b8kZig4sHH_wpS17UPjaJKm*=<RSD?B#o=CEXxMYbu8 zg0Kn8Sg>zZ;!n`0mKzF~Q?i9k9Kc9B?vYgx?nazH;7eI3-XHR5u7=;W`I6|woD+IX zlV2>vWkhg~SJMcY_iWH^>5a36RP2nrsz~zA&Kl=t$Q{@ZEccpPZ9d=QPs=6aV!}?h zdP4%PbYGO|X7PR$GS-XnS|Wg>Ep4t*lIA(pjL>28Na-tbt_mFf1UKWA)qVgNt$vCd zclrZ*kxA09#G@w-9@uImTl7R)<$~ik|B`+CVWj+HX)_0nBf7+~I4W0BhdnZ=N{v)d zeFLrcG*<+}s8_%F!+k|iUU*?uRg9|WYg%h7&-KmC7e>aC($X*}oSJ_9V$V_nZ8)8I z3F=h;fMPB?JNxJiwKYjvTH4TS)shL=0Qj<agA04_@4UVG#Pc?^3!TWQpgSRtd8=aP zys&ap*rvhnCmz^Ge6e!@AKxK<0kY^t&H3oYhokdsLEE2|mbX%_J@Jt8FE{%YHwx5t zMfw+-Ve!gTzy5Ad(;I@M9l4J#Wj8Q7=?Czf2%VFhIa?*3($FCY04lj~Zx&s3U8X_O za_n{PX-Q!fI40-8f9rjT_?=lg<lBmwpRqNbq(?DU=A+%*aNaa?)H~4;RlBamZ*jL| zI1cEVTb_hou05E0Z0ojDCWLfwmCP)~332A<Qm^#`$=>FIQsPM~R<@Qu{JB?PeC!?g z`0?LRSgT!q-rM_T*z-B>jB>sV7+3cz(1$j=YhakTiS*$?5<%n<DR|cvpv1e8@OU7Y z{0qA+rq6jW_%7pNEhyBX9p3SRp}Czg8Fkcvd%LaJ<MqQ}E7oE=IlyT4en$BLCWXbd z4Sej;<bJ5)bq<zxb!B%ym?$bP{(g40R|}dy-kT|s)Y8?3RuTfzne_VR$`l)cOvsMf z{ur;$za`!ebZ3?G<iRQSas~n1*)MzjfW^&F>tP)PFUR5FVlu!@Z8iJWo#ozHZdhwx z5MuDrOHzfP7u&K{pX2JyqsE;f%N$)R%Bs`J>U7RsD2W#$c_s#);iUI<J*^4;YWL#H z9-Zi;{88+c$By6?{9A|h>|_^yKdq>QAVh{H@LGf_q?EJd3oxYoh(YbOawAerPz0_A zMR`+*CXc^7Z}D)uaR^RmQDYbme{v5pn&G1OCe_sZl;$(fEl@YYVCt)aB~sM1H9NVv ziJl81nqhU2TsJ$|tm%Ia;^_`M>}JmV?Sgacy%GAg7kA`fWth<Ox2=rF{P?WyRAk8a z9thvt?!PD)jE>Ry<T<lg;6v?$KDnfA@W+h@#2J%YK5(u<QnTJqh~3;Quud$eh2*NJ z<E}*Do=S@@`&KcTtC3tpr6SdFtrap#SJ2?HEum8b?5)xJ#YTi9>L9^JfU1<sm;6(+ zqPU8|dMdZ5tn5SmvLbYj5JD--^Xx8r|6RL-wtV5{(b~)&PxR;TjH4Y?-jd*x;$&_) z8QCT}KYjY}9*yvVCW}eN+wqe#d50vpVykz0ZEJV6F0q~0nO!vhO4@0nibgXP{Fu#+ zfLEH~sy*cKLiLBz8>QeM@2*z&1n&>irCh-+N(t--^jFyZ2gW1TAo%{WL@L4?4XQW+ zS4li@%6{Q&krye&OglNvx7H)O2yapNt5nTMpQ3ZVM3vu}bmhhh;wd^bWKEt3P6WE& zRhHBimj^e0tAx?G8ab(Zm@~oGEgPGe4!=_d?r)R^`=YrWJjT~rxC=!1q9irzztAOa ziw1qdBw%1on0>{3n0^TpTShrz_4^b!iX+!?Lu@YxcHmm&r5F`hcw^8SHco=it~rhB zn38C4T;sXB+?sB(90xX<eK<b;xiQlJm5V4#Bv61TK4NJ}M_*qbQ-aO&WZ}pu9}{G} z8gdxgW7d9Z%w*C-&d=y;kBQ>e@u8m<CAqnyFtm6ZiQ+qKYQ&cAce<KONX)q=8DX$+ zBJPG%K8tHLA%-3i&N%1zth_$@ZGlyAFisT>NWfeMl!K3#(zERwQ1FWSI+$2ka3id7 z?mQeBR_;P6hsoE8(z44*qe+(SdPAk~3Q>X+6?r85Z`jCxOcH+30daI<ejB*U|8;hL zUiim!XD&`IG0}Rh6ZCfaVNQ25{;`!c(bNzp5hx-03l{Ssfn+GSi%eMu9g0b+m@iN> z?fo?T-%uINCKCKO&2^=vK)Q95^}LW?!l$S(AyTh`TH{)SwkC&Fj=J`P?1f=&2#_|q zsp)TFPh(>;)ChBMaL}``B+wrQT{0U68z=79`LowQog5h+uDU0|KiHxFb>{n?n-}VI zG7)7q?R~io`E_|c@^I=4y6VW>&BmIga+Q9vfNvQ0&7FSA8C|wyo7RFw{V3nU`*-b~ z4?M?e2D(*Gc?H#3yF*9=u(x{YW>tQZeqnyYk<s+w@0*VY2O`ZnOGC>k>^_>y|JEK| zcY~ZJS@)xVW*A>FbAM87LOH(mU%5OwsHra)Tn*pDX!TGywS6)P{MI~<m;AQRjU`$) zxAc7uoU5@#sy*o6@Nw1Vqc`g<rxi6x-~(}D3E1(-YC>iT)oWGDoAmb*dC6oqE)-fc z9aDYYcxCQz3d=W@f#ehc=W@21NqZ|Bbjm~6Y69v;&scB2Y?xw`J$hY@Wn~c!+MF!! z&Q@!HjZ{TZ>rT7|tq$9-_gfW3MKHfsm7JUc?t^S?zr4P_=JLBEMD~l@+S-E3H1)Gx zUVVjaQR)Y-|2?xBN=X(%DH?b=_FW3jE|HlJjeVuWhM?j4VbvSNUY#-=<J4h_g*MoC zEAPR`g5GY>@bnB43gp;rJ{|!m%o|YH&-~aL4;Q73l$6kY#B|#<)G}~Pvd7F3$exko zz`)B${AeE-%vyjhKuq%&5r?szhBFaLB60+#+J7P5UBK%NJ%r~_1sS$1CqRA9QSdG< z?74NywQn`X%saRM;t*UQ=6(40SRvENINIr&3(6lt4MWu&a>V8enSGL^micFX5l(Nr z1t@PxH@+diuZsQ^ZbyJtzy_}E0_BfBzW`R<kgHDBppV4O%`KNQ&=-z^6H{4M7CuZK zoSTq<ZZ(nlO{HRY5Z`2PQP(8io?0GT*VvbKaB#4>rA1v+6K9jR!Cr8LNQrloNK@)t zg4ffQPx!aIHOv@MyPlJy{?`ku^-CuiPyR?8^WU%IN99ukTRuV~+)-_3h{?%%oKB;a zF-YH;=i5-~EbD%T5#19)i5k2Zo)e?OP3O_)jhI|vPI>M_#8nQgjZy;`wd^fvP;KtN zj@9+miK_4N6Dp!TjiYJ{9cSx0uP|*o&gLd2SLH06`ao?q<dDg{NoZ5`bDl13f4R;b zhGzU9G7H<)!eNK~_g9N#eUSBec!65iM<^}X^>ZbK5|~@(H&%pJXSB=tJ^U1}L2ZCf z^<5#@v3GPSf6~TXmomp{xK{UEbV98E9I1>IB)$|%;*pMYNr-TwTj+OU4pxZZXl}0# zDI^HLWI~S&?dT9Vn8-@?*tG7CKr{4Q)DAc`*xHF8cKUnKd3hi!`h?Ze(z38Td;mW( zI{I}gmmjdOxVY`Yr{>>5xbp1kvT40jN<de|(cn&e@g5Za*2c44FN&=_;BQL)YQVGe zcDa0YzD3+(qRE!uOuGzVgYw^ne5aZ>k<H`U?bfr$39f|1rd0>g0qI3iio?I&nZVaX zhx6*#m3pKf&ILi?u88mXxuIKM9~-x3YC%+EN(+Z>26q7f=<U5Hmy+nf`;Ze^gS#>i zz8zO#o*NyM8$+2te2xFgs{LSnRSgqg&uB{#-&u2G(}5(>lfUhK$Kze2JO1khL^Jd2 zRPoYk|CBM~?+zk0SOPp_!oWC7O*X?;0)WZCpxkK@Tur6l9d^0X!r@SJP&#kkb>MgF z&Kgah>b2iu6RV)6!n<8vP5E~Pxi68&+p^Cc((=YBjvp8I`xZa*fcI;5@JAyEbqIVF zdGKk^K+E#MM!ZAzH?WD~pT^Yk^3Sl}0Jylg$i9i>qAC=arjOVASZm6kaiHAk>sqTL z^7-Lpj%-kn$ocs>7dJN)6sR!a&4aqbBGcJ$P-E^3+sg7ncjDT8OSkam&Ra7Fjys(` zMa~rtg+A-e^r^ajPRR+o@#}|Xd}S$HrvY96OyN2isH@IsI+Ssb0i1St&5>Wh{zdii zsk-Tp;y{Bt?{Zj+RB+Kbg2q~x|D<DIrg9ZCvvvNcPwU-*h?3!q5JSHTf0@8BLZUGj z$?lT|K;uwoggH2u+n06_jlJD4KV;M*$j8G+X+L}PFeQCx^@Q?ICj9_@SWr9A=s}fC zQr8&EJzvhiP+}-MQjYjj*1ejxniA=u)oUOW-vJk*>Ql`W$7q>Opzzzy<-#1i)$DP- z)uXXc-um}Fb}e08x1qU#8>uS%#eal=>@&-w&qCiz3qnd+WlXM7EX=Qpa9l284Z=$q zrKW&HHB;Ksii#+fmX`8|(H)(g?8C0l`1ts{UY$5#1E%zboB!z1JEY{udOB8c3Dv`! z^5u<kOAt#%_MsEJEL&K8v+nJWQ6(%eCOtJJE-HBR=bBt}?Ax0al>JBZtI|*xWpH7w z-KOyDbb74>0gU1tA3IQ?*I>SzrD_|Hy1l(*(g}i*AeF5Gc7{B776bXWLVu4AGCNsq z1G($SF6y4?NfwjpW+6(CW^Ya}X;E&J`9v9LWo5`4X%9t;ZeHl={$v#A*R+2MGxLKH z%4%`9W{Gl%^JQ!uW#*3AH++Z>1mDr+$=6^ochvQ>)i$_o=J08R$ct_%0yY5Z-*FT$ zBpT_OF(?O0I_w+tYtz!wN-eyLkRZTXotMdYb&QOnnd$skr@4hI@BV$onZ3MIKRdeg zlvbC~_E&t92(L^;t}x6*XmnnZ|7(IbV~DBZhsE1(Q~nR3jqcJ<4rDAZ5>i>mwjW*s zx0@P#(ygb=q^-^{YcQvwcxkRGL00ziUB@9)4)f8H#i3(HXNZW8hi{m7+OGqj$ITP_ zl(-SjD>c%E+8YY52kudy<o4!_7tc02En#0UL|r6C`l#FqA_3QCRFu~9(tf!&uHOJ8 zkh%&khM=aU>KDc~DN>AF^`J*TbEb0-V_j4To9Z8M1XP$<O#}JU+H$fh`Qk|dR)y%g zj6Ais9lP+iG4iWFyX)=jlJBV_s+j#+rDr0^qu8-Pf~+|3z@9tWD4NH`BNTnf6<fl1 zN4qRyph?Yw(t*%}^;DBqixkM8egc-?Bt=!F%!b(Bu)G5}HqN_gyg7R8Lo$?xIqaeL z6~P&)a7GhccpT#R{Kzbnkd?5U_Al<}uT=#f4x$P6R&bsu^EEe}n)~LXEgpk!20lWd z`VCZ=u^bvf=IGoSmmIz`{nydxw^38IF;$Jb%odoLX$Ku0?O&lKuf4>KlGVGa`?^gG zQ$CCX^T#)ZcX!33sv<B9hjG-qn~1JugpjlKh<6{C2IdL_wmJ~u%_KCAvqe6IVz9d# zDVR<}KLt|gAd%Da*(|l^we2CBETUJW(;@eJ&`v6HH8KR+M5Th$w(a7+=UrH(0;g?l zvOf6rwDOfKk*@19+rIAWW|uF!9p%KXhk&}j|I8<v1eIka`XR0&zKbA!LAoP7<?on@ z;5EsLol>a+KBC}ak&I~hu?b!}jKz--4+fQHK+1Msx7ANmKGg)CYg?x|8{Y;{u53cE zLa^9&L;p|}_`Hkb*=}sImu~oLMZ7lm8o$WOzww0=JyCmP#+%)((th8)+l6$P5&m5^ z!w$^pi*rmQ`03tU74W`dQru{U1L|RNGj-0auJG^`cOdJFQO>>Pt)(iZEzY}fzpqmH zz%Y1obE-<aI)!X{Do^ldeSIQh>9&wt%0uUDpG&^O`4Llvd_<8@lf{IrkLIbr3B80+ z3VT67cQV-^aigg6(v>MhDTsIXqf+)?iU#o4-3w|#zI|7Xt*!ABFzHt;OB>G`MpY&% ziiy;EUMg$Lq7D+|@yNf`)#brA)nBn-DusCr>tC}%xP1wNqGYGWB<A+1(-zXh!YH~X zx2M71>&-Kt+%&LYzLLpjBo3O%pU@}KMEl+xgug?5#eeMZZ*M5pTIz@L2p=Xq6sTNQ zHJ{b+VnaDVZM~mV-(sqZU2q9KORaAy{J}YfIfYl+Jgb+Rj?_mO_g_V(*;L`^u0<|O zhyQIn@;nmKk6@dXSXnfek*~Y0*%&U2AL$UJEoP5=tPXZS8|_6l*YK>jpWG3$`>3Gu z&Pe*eH_&hDNLLZTqn#yUHkMA9#ns_Ib>}{!8*o9Q>Ha<8<rG1|LNkP@z005QC@Ykq zvJPcgqN!^(O{Az@)9<80Q<?!Wmuo$h90?~U7Ozg>I$0LHyYn?!6%}+km0Y=3AWWz5 zL*c~aq%`O6D6wI^y|@L~e99GWO(PYxPcz3!oE)idDu8bZe<hWn4df$Sn;#tZ>@-EU zZlq(U5&l3W!DhD$CfK`@5#Pp~Q=r^?#CcZ~+}+<DF{nQJ<G3Bl!VI&q1ljI#q&bt4 zA1)fZL2w@z6WntN^+|)763>BA;rhB)h;>TS(gqq4ZXI735S-`(JQw*2UNO>Ib&~cA z&9_@wsS$+!-g7oM<8Mk9Q0Bj4aQudxgUmiMqc5bVQRW0xUVtkJKw+3;?bF{D3NESy zL40aF+8RJ$)S_K{%s0ib)4I+CG-4jMz^B_ZM~b7`(877~NW`*7EiF{Tg+_sAf|Xx5 zCjVg4H0jj*{V^pdMmerQU4K(z!xd+ydr;+x{b%aA3Sh-_1+v_B;i0P2HUX&UKgM6Q zOK*RZF4Nw-Tg3Wz+naO^Xp`UPnU$>4E}-h7U%Ji*qnFA{-g0BA@WU7iY^Yw$G%`^# zHVcIixcK<R?`dCsZ8=^{N-Wb_+={H@%RHpOA<AHB%LV@MNgT_TE7Q3H?#9tXhJ&cT z&b8k%Rtza%5z(dQU2;H3Q_3h*2zp2IJU*t2c3Hp#py|<UZfuLraY=_O>t~xBB^iGp z3@t5fb8~ZClsCB97AlOotvR;EkFX4AYG{0S()V2v$3dwYkM<w`?6CEUkWi6tVY(a% z?_gB8jA+1~mk{!gDc|wZ?0uQs?0pmiN{(anbfaW>Yja~K%b>bjg5E{lkmt*IRvYMM zkDPx`B|zB_hPD1KU?|4CXa9Z)<00tuvx7pgR2Js+;DJUnl)uo&=U~+>rO{a$P3NB? zWa|XQ<nq&sA5(-?{|NEKa8u!jwqaVdXqW|$9K-1L$*(@gTABXyd$8Sw0laDb4qK$g zoIQrY7xb^u0=faSwWES`KEoB9(abCoa(_9kt{!T<xbNi?jK{mdckb`HzCgOn&E-sp z<Hp!d<3>GuB`}#3CsBPT+HGN!>%7i25SUqvez#$UimFG}+EiH;B`Z8sT@{-8U5LHx z30FMSuqs?x<Eg}eK7XRcMo!QtVe>DRPaaj()s1WCuHD`eQI$Rddg;EG-S<?jdbLYe zrKc_{=Uz}rlt45{2ug#FeiRq-3Dl~mHoa-mxx5|UKO~^Cyyfx}_rHwKWav^ICP;FW zQg*??cL@9!dUSf@|L%Wo<Rzhey=cjF=07Ar_Rxor@`ts0a6HAdGbt=Lt_FqZn5Zt4 zp6R;R|J7Zp4LB1Tx;Cc+eX&Q^H7Muo=gU`$$EvS#0WV9&cmC+PThtH*kp$*0^}#*r zex1$j#Ly2EK6A~3BJ-Q{aq6r>xy0W3D!sD7jJ8nP5pM?tw5aB<T3GN7N25uJ6T+Wv zXnbn3^NfQtUH@V+Cp2e)#xDS8A1kx8;Zs`@9r0#NmM0{dNit|EVIY8fxtYkm5g;q2 zw|y*oet|lLv(bfpLuw*EC(X+8fBD2Sb5dy`z2H=_02L|0W;c0BbBn35uQwlmj6-&) znLpY_*ky&s*|*;qS3H{-A*JJzIrlB4JTd3oTHbISv1HP7suYss6Tj39490)x%0x=T z82X>LtT>Ezo~F{N9z31aC$`tOwx&-_siZR-;He}OGw1aExggDS?qn>kae<EUaxtNa z)YDi`zsu^5OW2E=O)Q;RW*cDsnsx4dh!ND*9SWW&Rkt#|M^9UtFWrJda*FTcx78u4 z))kB!wO(#4%l9G|{#a&B-=^0<5f2i}*jG%0vq)&zZrg+|UFoyvK8vTPkHc#{xi9!( zJkuhIWX-9O{9r%~F)_|WyoiPK=xr%|<9q#+x6RqV0>!^ocJ;%-cARcbAHYopeQTFY z^t;gqb_t*}c{tr*pgzCZCN+y7v7ib&D|LooBp>Y@9!uGKtu8dspoZ1`hl_8n_w1-; zz*~OW^GQ>Razt;nG}sc&&5106|7LcQ4?n7^nTPXgRQ71BJgL>i)~A!_UggEQK+Ka| zo&ZF2AeR%9rUUye$U@WOY{jMWf||ZHe&qOO=3tX>(^yY$RF*tYN>)~O;?LqX#FJVY zDxWMaE`GwrRoC;q@K!KzLwl`%{jh)gGwP4_YYqS2%dPH+9>0wu9bK&n=WnF(z^z`; z*;ABX+I$7UN{etNmFXz|?0SlD!IoZ|`lW5+N5k#~!!di!3+u${<k~>lm5a)X$>ms8 zdK=m-CZo^4;&4Db=AXwo$FfrJNCP!5Z4Z^7#Tk?b*EtBfVhF<O-}u=Zo}VR<wBuN` z{wwvhi^x8l6vTp`J?y)E3WM$s|1b=|{p<YjZr$zE(IR5k<A1u=*Z77ZQCTukQ}th| z&u`dmd-KU_!Kvq;?Y8j05V=PI#B~YnCk;xxO-&4>WwNlXCy#~Az~{T@$sAr3&$MY> zZS6+i8!N~Nbz&5>TKfDl_+EMTzM$vHu+Due_)VdC3nX{j^K7+naoFJ%9cjSxk$cor zC!FC-p~r^k2+z99i@oqEH9Z()Su!GW<p?ocuDiNx2-fD^C7UV3IwDvN;Uf%K>=`ua zfic<-4J8bxat(%{#u1VF`w7bYxVKhb6q?tch9)4|d-w!er=Z!MnN!4!@I<mF-go?q zT4(c)<2#CBHXD=+#8tUJ?Q|_4EvZvJKf*WloLfJv6^QHJcK60fBm)~vVf1Ug1`;AI zRvOI_{qHX<M^k8-fS9C;HXUzxG@&pik{<B?!V81v3tZnlIS&kU5jj7i^$YLfC4WAx zbfZ<N{!E!%#;$HRQYKdr{uPLM>hdzw5szln>D%zv?t-xGXgvX`#n(Ul#65nmJxQ%| zv%d$g4nJn_PhBu(RVTHReCHNpZj5spF#O?OGgA5~k~Qi%;R5^I*!!i4r9w>@a-SFn z#I55s#v}FKVtQJ7Re?VfhQvOdOK9ho^fPL03*KB7zt4NH&-fIm1)jSqc5FCp|MQcL z)Ycx1BoCqwdf6q9<=ym=<ReJ{S;CbB=9vVl1D#DiKfUeBV;waPGJ~r@;f!o-0?iV* zJ$73RG3bFN0r$7n#r^oJigKA0DIxe=kWh|Y@s{OX(GJRW?6Q;ud-^UrKxl4uK`=dZ znF<9S*nnsiXi1mVkb21F@%`(lu+o;SgbcRO+oXP$?#6_ig!3tm;AFQa7J3MgIz?;9 z597M7$9&hxc|ayXfhI7|HadC#*YVV|K!FIZA-mwp|Nclq9=tOk(Or>u*x?;+Pz*c< z?V!kOU-3GGgs}eW@~YEGD`$RCbwuE1+ksEUG%R|!%|ZyUquB5Asz5aCTACdgO3;K4 z6S#&?27CiRkr7&4n!C&b^?BZx!>9q*Sd}NfG*R$j-+Oj#)dGJWw%p{)G<HXrtsznU z*CC*)s>%Cu^QyQ<>l(az?qz3h|Ff=628kWoA7<ASRKTNuOS=Jo5U52x+r%<dsY8&- zrNI7vzv#Zvc~$)lda32fZ^cY>0-80dtfW@N<o{HZHdu9zl+s91rc^!Bp{}TBc;2jT z!&aVVt4%jvlHLTgg}#4ghD5n`b2jv9O-J>ohfe5T094KY_5vh(gnzNrm!6B)AKSUR z^O~EV*BooEnzfN(wrrg9z~&d^g?4Mx4DIJ3sv<tXQAQz4$1~+XLIY3Mj4ApJi2d3~ z^Aw$&k~G8?!A>(YB5Q0;An7nb(m+Ej`m?Iz6A(2G5H1EdN}>6QyuvI$ccCsaH63n1 zWS=y2<x7>G6o%;@j)?(iQ%Ff;V{OGOMq5D@q8`8gp!yVOylyT*)L%($%t#YPk0l{Q zAwP#PU13Z)U=HtmQg_qvYS=y;#ucG1o2z4!g}K8mpF&lv+1b%iSzBAy)`p)k9!?{l zIceqQ=2lr#LqkVr?IV2t$4)O@ROO$~j;r^r?_;xcFAs%#x#|Z~FkhBX>fdW@(sHhi zE59ALL}Xjkl7wvu4efvSDKy<|9tO(FXygG`;tzwC5Vo&<@O7OR0#*}Ixe8bk>rCU< zYoiIYc=r{Pa6+A1s@jSk*?X8u0@3#6Cyzt40%Jqc2&}_9WH@sKGNh8>rBx^RH1d9; zw;RVE*Vp5$^XuzE#R3&7d1FT28@S1)(nyV5>f>CwofRhAvyNn5c`>Yo+cUO*PcsPG z-`(K!C)>;3`~Uaqa&lEw=`bxRG+8iUFxUq&i0{g$p(w&h(%#+<O{jfd-@uW`O{cL< zppjQ!l|pQ<rj>63aCtsIOa=Sf9HXJKW@F?1IC=PouT1bSJ9FJl;*>pZyYEU&P6|D8 z_q!B)??CFb@Vz0QK{Aaz&NoDC7XyI9E6nef!N5%_*p>OS!^lftq)MvK_nFZ7Y!^dv zZKRPGMGAZ$H+gdtr~24y^{df#zPu<WsIJORsxEYUT{K`?d99FhTjEN+B+<GW!OYF% zD(sAuc<oIu1(?#c$B)!o$E$<?j%o@{Q+(5-h#xVQI1}*N`Bf0!gK?a?)d*2KLnUOt zdaBx~T#%nHH%@7KZQLy=%lA7DCPXlr1dxaX@Er(LBIA5^xpR1V3GwSDOC6QEH1*Lz zLPJ9%5e>?<o$t#kBm<Bo40fM`Sj#oP`sGKM8$k@{Q&p%qm5VnBzx+9@LI8QTetWrf zA-)A%HMBOFHNp#NXm&p1yV`$XV8nZ;zOqn0zlak5LDQ&_?gPXvO)F7MAJN`k7E?pQ zW)v5ysiNZc*Bi5}d}Wiv9$mJe3-kDPXAVfB`I77Z*pDF^2Nw0dFx06xRyH@MX6?Fy z4GP|yGzJ1kvbpWqvXowKD?|qmZ=}z*S{)65a-oJ_Dbe<W>=Nl>o+AkTf`TLkw3&m* z{Kms|qi=DPNGrAz+YCmOQroX>1)bj8UyY?3oC+d?^{f*9F2N=O5_NT$((UcM--VW> zf7SqBRR8p#1;u0MGQ4=!*E7WG@A$1%TMv)A74kIIaNtwD-VnuC3cBuyr3LEg?eo>@ zm<ZOK8FI6MopDL}Z6vf8U9h7L4y-yliVxX{iHTkLNR;x0vi_4;u*}A$r>)PyEzo7B zlFNrhOBDi5HP-0Z)4K+jS5=`{=+zO88Ew?fI3zlGqPKkUxUXiSpM@+iA7hzir&WJ_ z9Ybx3$M#o!rk48D_dFaR<n{wOR7YS~S&iTw_NAuD45AuIjOO&bYMK>RyX4Z<?k917 z>TS$rtiz?NC~=Yz_9>6yGfZ~2U59G!il{NtqaE^36RP%Z%n9Y&j0us#DtDaM_`QdB zd~??$$u5UlXcF4<bV)i&zG6PPpkSJ}=TUjWiW9mLcgix1V-z`RE(ZJGeqDMv@OpP@ zTArUyA+ZxSW2d@tJAgRpi(jojy#>WGmUoXc@`14^X9mI9;0=IieGM=dK}cV(F%x>4 zC=QfLgncKfZ&8R?GZ7Zl9Qo$0^}|_?qn=H|`MFd+V=7I33rlVb08wbVhE7JEN^|gj z`M_m_qk~Y=Ob~bh%R=FGE7oPI8Ca{1#FG;beO}0<b5QDND%~%uNuulP>pm*Kx5vYh zjsQvanv3K9w|SdbQ3L@?l!iM`y3@;shC->~jy2}A0~=_=D`jh~3}<?xj!y@;;YO(Q z{RMV*-l95sjRfD#K9;4SMjthTxIh1?Qmz<>gWpuwUg~OmDkk-Iup>==y_L^Mt8Vg< zm7B}Pp%YnS_dKCxA1~W6joJqyQQ{)@LvWslNl?B>q?BHL=gMHb(-el!nH+lhcdFOv z#avca2KW+9FS8Ne-|qMtE$k^d_z7E@feN;vlll%{#^)SiaACTgWnFY>;X>twBcBiW z=r>*y!qCl(APrBU)yTKF*gIcgBBY3R#S=;eJ41hM#x<*&#g5qjz6D)WeK!o_C7g^n ze2GA~Nni9H)`uv>+X&kFEj^-rdd#XWkIE>(CeUb(KpXu$B_hH`HneI?F){|Ju;?el zSP*J3RGtXiGR@1+=R1@!HYT%Qt{XIKoLOIwn?EjXZcgL2Un*2gp|AvQEN!pvPDDFj z&N-k#$Cho1DUuZPCZ@Tja|7FrW<a|2i&+nMu{06K=cnOb<(|qKpo7Xn3#U)_eSJV} zZ4{+BhPHOKanG-Z<1kqcBzgFY0)hRM;t@wJQc;MW!kzg;&OqZ#WLMXNVi0s@L6^Uu z8-PsPP(z`Ecfa9n0#qXAafmu@iB-RE{Q91ih9iojZQB}gc!3&2zmUf`me#+~<=JN7 z1D$52dZUpbdT(G;KM9H|y4UgBkH48;#&Yn#(?D>;DrFlmdPV+FE6#bkPE%CDLU56P z8dF^2j6BoOBqqt4ibnKEhv}xP<Oy(FeM>Tph#9%OpI=-YEO@)Ea2daCsSjj!(sc%I zbVj~fZx5_6gMDI2XsPO{`pnDK#&4fl%czHKGEw!TAEmJzXPnxb%v^2q>Bkz`9{6d> zgNZz3q{Isyd>yqRL(4k2&RW`@))NxQ6!weEbgDXzLcUFQB{2kzuLN(cP>+8%bC{Bn zQpqh1fNq8YGT{*s6PJ*nP_pxrperaUnjdU3GB6N5r5uasrB_F|PiGaD(R1pDaiTQG zagJ-XJpA9bo*h~TxW{s_vxA*qBZ6#}>s8bD8JK&W)_Y*yNyZ0-k3t9tm`XVM+Dm)5 zOF1&qkj&lXM=9ks#IzT?Q)rmeEVC@f)6o(WOX}(pwq6c+U6-jnJv|{%ABSBsOYqB{ zmkZK^xf7nbjxE$YG9dcOJ?9R3Elo5qIos7DxqtX#5W?zoM9rxja{@l*a=HBOUhj?U zYX6N620I*SapB_4*K*K|Tg!_NwyF2Zn>ZU407s-ZY#QcZv!({J2o*0u_g1t+la`J} z12kP74HP2MH8W!eNwUcfK2oj<X>!oySQAMSV89iKv60wJ=L<vg#nPYTS}Uh7?}t6U zsb+K8K1lRf@3_`y)*bGL>L&nyM8QI&K7H54^5`fYmNm)BkdfCJcsL>ioSU8*&gp#q zHZx_n_-6{{#`LE8W7xnc0M5#Bp&HU`2cWUF_X$m!LP-0glFII5MwJ<N;0Z`|r5F<_ z1YjFPI+OQr;aTWy3N~x&cl&Wq3*9Kq;Y-p<%E%y8>(-+O<4Xv!j9)hvSyF*$AI>L_ z*Z(zzUeMeqjQ(e&Bx9-Y@FLpZWtq+l+J8E#G;u`h7mud0s@RcN(>@iroQq(f>aFl1 zR;JL%WAugxLcOL0-{YQK@{b>b-S?Y{K|ySJ&6s@%6UmnCjy|j67pk=K8~~DYwTC-{ zx*NRtE-L1p?p29a^_bCDQ3*Nohqb<jvV%6olv}?ee`jY_*6v%4zI~iVHGTat-QU+g zqAXq|qHvp-hR^d*4=*lsAKwI7pgs$tWVVx_04Lf7j&qVrbmIGu`LLbH(LRn^7X%I^ zkP03hAIk%Ep;lx(gEi3yhav>i><80$&Q2!n-e%C;@RKScA2=DPrmMVk^A}g9{7`yI zcJP1PuyM}yXO$mZgLDejR`uM{($H*)tgAqthnE-CILGc#JT)h0s@^XvG*4GJim;;} zG`3|l^5ms{LJ-jO-IoA20kObCesMxi>|ZEchC0QxYoBNfLI0mbf0xtN9!EaV;Hz&7 zLZQr0qB$m%Pmy^6_fF^dE6JG?c$Owz`cwAOg1zNZ($17!0wtoB5uJD7@ckSL@c-XS z5{$+UBj`4>d<LNw8>W<oVD1piAe^OJ`ug{MWC4_nz6Qg*^sUQ9!{6dTw<H7PrB$Tr IBuu~mA09cwRsaA1 literal 0 HcmV?d00001 diff --git a/Public/layui/css/modules/layer/default/layer.css b/Public/layui/css/modules/layer/default/layer.css new file mode 100644 index 0000000..9f2e523 --- /dev/null +++ b/Public/layui/css/modules/layer/default/layer.css @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://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{background-image:url(about:blank);background-attachment:fixed}html #layuicss-skinlayercss{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;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}.layui-layer{border-radius:2px;-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{-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 10px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:6px 6px 0;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;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:#4898d5;background-color:#2e8ded;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:5px 10px;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:1px;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:#BBB5B5;border:none}.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}.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:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.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;border-bottom:1px solid #ccc;background-color:#eee;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;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;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.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.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-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/layui/css/modules/layer/default/loading-0.gif b/Public/layui/css/modules/layer/default/loading-0.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f3c9539a22171cc2f12639492e346d97a9078e8 GIT binary patch literal 5793 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 bWW^%>x7XlHV^#Q1uOX^B?ki3(VEg|7!QHuF literal 0 HcmV?d00001 diff --git a/Public/layui/css/modules/layer/default/loading-1.gif b/Public/layui/css/modules/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_hjB<KpSb=eisoiA+`yS^%|&b8})KEqJ9 z;%V-@${+t;2BtNdDE)AlntY<|=n3;@Gu#&cXcp%TK3Tf5oipv4W}EAE^<696tGcQJ zklZH#bR-J{H_&~oJwW%xAY3lWz{<b{mJywz-zc&7=AF*Mpj5rKD`onI4>u{YB2<bq z2r}?6FvHA1k`ZMPg_<EeC28itEFRgOtZiAT$AW|3>9{c>Ob}p@z~Ks3xCw+@!HClp xtZ<(QPf3`00FNu+VbOvoEE+h73k#4LIKl$IE8t;)<_eUs!0QU6uz<M28UPBGzXAXN literal 0 HcmV?d00001 diff --git a/Public/layui/css/modules/layer/default/loading-2.gif b/Public/layui/css/modules/layer/default/loading-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bb90fd6a49107a321c35b9cee4a7b810314b51f GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/Public/layui/font/iconfont.eot b/Public/layui/font/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..bd899838fd07b3f32bff5b425cb104e81f64afaa GIT binary patch literal 53074 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 MA79aM{g@E`ALk|3mH+?% literal 0 HcmV?d00001 diff --git a/Public/layui/font/iconfont.svg b/Public/layui/font/iconfont.svg new file mode 100644 index 0000000..3680fce --- /dev/null +++ b/Public/layui/font/iconfont.svg @@ -0,0 +1,387 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +Created by FontForge 20120731 at Mon Feb 27 22:32:26 2017 + By admin +</metadata> +<defs> +<font id="layui-icon" horiz-adv-x="1024" > + <font-face + font-family="layui-icon" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + panose-1="2 0 6 3 0 0 0 0 0 0" + ascent="896" + descent="-128" + x-height="792" + bbox="0 -212 1385 896" + underline-thickness="0" + underline-position="0" + unicode-range="U+0078-E6FC" + /> +<missing-glyph + /> + <glyph glyph-name=".notdef" + /> + <glyph glyph-name=".notdef" + /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" + /> + <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" +d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 +t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 +t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> + <glyph glyph-name="duihua" unicode="" +d="M508 836q93 1 175 -34t144 -95t98 -141.5t37 -174.5q1 -88 -30.5 -166t-87.5 -137.5t-131 -98.5t-162 -48q-23 -3 -48.5 -5.5t-56.5 -3.5t-69.5 0t-86.5 7q-107 10 -158.5 26.5t-41.5 18.5q54 9 93 29q21 12 17.5 33t-20.5 39q-52 57 -84.5 133.5t-34.5 164.5 +q-1 93 34 175t95.5 143.5t142.5 97.5t175 37zM708 385q0 -27 18 -45.5t45 -18.5t46 18.5t19 45.5t-19 45.5t-46 18.5t-45 -18.5t-18 -45.5zM451 385q0 -27 19 -46.5t46 -19.5q28 0 47 19.5t19 46.5q0 28 -19 47t-47 19q-27 0 -46 -19t-19 -47zM197 386q0 -27 18.5 -46 +t45.5 -19q28 0 47 19t19 46t-19 46t-47 19q-27 0 -45.5 -19t-18.5 -46z" /> + <glyph glyph-name="shezhi" unicode="" +d="M917 445l-70 11q-14 2 -26.5 12t-16.5 21q-6 17 -8.5 40.5t4.5 40.5l42 57q8 11 7 26.5t-11 25.5l-31 31q-10 10 -25.5 11t-26.5 -7l-57 -42q-11 -9 -27 -11t-27 4q-16 7 -37 24.5t-23 29.5l-11 70q-2 14 -13.5 24t-25.5 10h-44q-14 0 -25.5 -10t-13.5 -24l-11 -70 +q-2 -14 -12 -26.5t-21 -16.5q-17 -6 -40.5 -8.5t-40.5 4.5l-57 42q-11 8 -26.5 7t-25.5 -11l-31 -31q-10 -10 -11 -25.5t7 -26.5l42 -57q9 -12 11 -27.5t-4 -26.5q-7 -16 -24.5 -37t-29.5 -23l-70 -11q-14 -2 -24 -13.5t-10 -25.5v-44q0 -14 10 -25.5t24 -13.5l70 -11 +q14 -2 26.5 -12t16.5 -21q6 -17 8.5 -40.5t-4.5 -40.5l-42 -57q-8 -11 -7 -26.5t11 -25.5l31 -31q10 -10 25.5 -11t26.5 7l57 42q12 9 27.5 11t26.5 -4q16 -7 37 -24.5t23 -29.5l11 -70q2 -14 13.5 -24t25.5 -10h44q14 0 25.5 10t13.5 24l11 70q2 14 12 26.5t21 16.5 +q17 6 41 8.5t40 -4.5l57 -42q11 -8 26.5 -7t25.5 11l31 31q10 10 11 25.5t-7 26.5l-42 57q-9 11 -11 27t4 27q7 16 24.5 37t29.5 23l70 11q14 2 24 13.5t10 25.5v44q0 14 -10 25.5t-24 13.5zM512 210q-72 0 -123 51t-51 123t51 123t123 51t123 -51t51 -123t-51 -123 +t-123 -51zM512 384zM407 384q0 43 31 74t74 31t74 -31t31 -74t-31 -74t-74 -31t-74 31t-31 74z" /> + <glyph glyph-name="yinshenim" unicode="" +d="M512 834q-92 0 -175 -35.5t-143.5 -96t-96 -143.5t-35.5 -175t35.5 -175t96 -143.5t143.5 -96t175 -35.5t175 35.5t143.5 96t96 143.5t35.5 175t-35.5 175t-96 143.5t-143.5 96t-175 35.5zM266 590h492v-34h-492v34zM758 178h-492v34h492v-34zM140 367v34h744v-34h-744z +" /> + <glyph glyph-name="search" unicode="" +d="M439.5 121q-74.5 0 -142.5 28q-65 28 -115.5 78.5t-78.5 115.5q-29 68 -29 142.5t29 142.5q28 65 78.5 115.5t115.5 78.5q68 29 142.5 29t141.5 -29q66 -28 116.5 -78.5t78.5 -115.5q28 -68 28 -142.5t-28 -142.5q-28 -65 -78.5 -115.5t-116.5 -78.5q-67 -28 -141.5 -28z +M439 797q-129 0 -220.5 -91t-91.5 -220t91.5 -220.5t220.5 -91.5t220.5 91.5t91.5 220.5t-91.5 220t-220.5 91zM890.5 -49q-34.5 0 -58.5 24l-157 153l37 38l158 -153q8 -9 20.5 -9t21 9t8.5 21.5t-8 20.5l-1 1l-152 157l38 37l153 -157q24 -24 24 -58.5t-24.5 -59 +t-59 -24.5zM281 327q-66 66 -66 158.5t66 158.5l38 -38q-50 -50 -50 -120.5t50 -120.5z" /> + <glyph glyph-name="fenxiang1" unicode="" +d="M770 222q-38 0 -71.5 -16.5t-55.5 -46.5l-249 125q7 21 7 43q0 25 -8 48l248 124q22 -31 56 -48.5t73 -17.5q65 0 111.5 46.5t46.5 112t-46.5 111.5t-112 46t-112 -46t-46.5 -112q0 -9 1 -18l-261 -131q-46 44 -109 44q-65 0 -111.5 -46.5t-46.5 -112t46.5 -112 +t112 -46.5t111.5 47l259 -130q-2 -11 -2 -22q0 -65 46.5 -111.5t112 -46.5t112 46.5t46.5 112t-46.5 111.5t-111.5 46v0z" /> + <glyph glyph-name="shezhi1" unicode="" +d="M946 322q0 16 -8.5 27.5t-22.5 13.5q-8 2 -28.5 5t-37.5 6t-20 4q-5 0 -10 4t-6 7q0 2 -12 30q-5 12 5 25q5 8 48 68q7 8 6 23t-11 25l-56 56q-7 7 -20.5 7t-22.5 -7l-72 -51q-1 0 -3 -1t-7.5 -2.5t-9.5 1.5l-34 14q-7 5 -10 20q0 4 -14 82q-2 13 -13 21.5t-24 8.5h-75 +q-12 0 -22.5 -9.5t-12.5 -20.5l-14 -84q-1 -7 -3.5 -11.5t-5.5 -5.5l-2 -2l-30 -12q-8 -3 -13.5 -1.5t-17 9t-62.5 43.5q-15 9 -28 7.5t-22 -11t-51 -50.5q-10 -11 -9.5 -26t10.5 -29q11 -15 41 -58q12 -17 9 -27q-2 -6 -12 -28q-3 -8 -8.5 -11t-19.5 -6q-9 -2 -39 -7 +t-38 -6q-14 -3 -22.5 -14.5t-8.5 -27.5v-65q0 -35 39 -42q23 -4 74 -12q16 -3 22 -16l9 -22q4 -9 3.5 -15t-8.5 -17q-9 -13 -46 -65q-8 -13 -6 -26.5t11 -22.5q10 -11 49 -49q11 -11 25.5 -12t28.5 8q15 11 65 47q13 9 28 3q5 -2 22 -9q13 -6 17 -24q2 -11 13 -79 +q6 -33 41 -33h62q39 0 45 31l14 84q2 13 14 18q5 3 27 12q12 6 27 -6q7 -4 64 -45q28 -19 52 5q11 10 49 48q12 15 12 27.5t-7 23.5t-50 71q-8 11 -2 24q2 5 12 25q5 11 18 13q9 2 84 15q31 5 31 40v66zM909 255q0 -10 -9 -12q-1 0 -12 -2t-23.5 -4t-26 -4.5t-20.5 -3.5 +q-29 -5 -38 -28q-4 -8 -11 -27q-10 -25 3 -42q1 -3 14 -21t23.5 -32.5t12.5 -17.5q6 -10 -1 -17l-13 -13l-22 -22l-13 -13q-8 -7 -19 0q-1 1 -13 9t-26 18t-25 18q-23 16 -49 6q-21 -9 -22 -9q-27 -11 -34 -49q-1 -7 -4 -24.5t-5 -30t-3 -15.5q-1 -11 -13 -11h-65 +q-11 0 -15 12q-4 13 -12 74q-2 14 -9.5 25.5t-15.5 15.5q-25 10 -28 11q-29 12 -51 -4q-3 -2 -19.5 -14t-29.5 -21.5t-16 -11.5q-11 -7 -18 0l-47 47q-8 8 0 20l41 58q21 29 10 54q-3 6 -4.5 9.5t-2 5t-2 4.5t-4.5 10q-9 21 -38 26q-76 14 -77 14q-12 2 -12 14v66 +q0 11 13 13q1 0 15.5 2.5t31.5 5.5t26 5q34 5 43 29l11 27q11 25 -7 50q-44 60 -45 62q-7 11 1 19l13 13l22 22l12 12q9 8 18 1q53 -38 64 -46q24 -17 49 -6q19 8 27 11q24 9 29 40q12 74 12.5 77.5t4 7t7.5 3.5h70q10 0 11 -9l4 -21t7 -40.5t4 -24.5q2 -9 10 -19.5 +t16 -13.5q30 -13 31 -13q8 -3 19.5 -2t16.5 4q73 51 76 53q8 6 17 -3l13.5 -13.5l22.5 -22.5l12 -12q6 -6 1 -14q-1 0 -7.5 -9.5t-13.5 -19.5t-15 -21.5t-12 -16.5q-16 -23 -5 -49l9 -22q12 -28 34 -32q83 -13 84 -14q12 -1 12 -13l-0.5 -18t-0.5 -33t1 -17zM527 489 +q-83 0 -141.5 -58.5t-58.5 -141.5t58.5 -141.5t141.5 -58.5t141.5 58.5t58.5 141.5t-58.5 141.5t-141.5 58.5zM526.5 124q-68.5 0 -116.5 48.5t-48 117t48 116.5t116.5 48t117 -48t48.5 -116.5t-48.5 -117t-117 -48.5z" /> + <glyph glyph-name="yinqing" unicode="" +d="M422 277h-236v46h236q8 31 33 50.5t57 19.5q39 0 66 -27t27 -66t-27 -66t-66 -27q-32 0 -57 19.5t-33 50.5v0zM512 696q-107 0 -198.5 -53t-144.5 -144.5t-53 -198.5t53 -198.5t144.5 -144.5t198.5 -53q114 0 209 60t144 159l102 -59l-23 -40l-62 36q-52 -80 -129 -130 +l35 -62l-40 -23l-36 62q-84 -43 -177 -48v-71h-46v71q-93 5 -177 48l-36 -62l-40 23l36 62q-77 50 -130 130l-62 -36l-23 40l62 36q-43 85 -48 177h-71v46h71q5 92 48 177l-62 36l23 40l62 -36q52 80 130 130l-36 62l40 23l36 -62q84 43 177 48v71h46v-71q93 -5 177 -48 +l36 62l40 -23l-36 -62q78 -50 130 -130l62 36l23 -40l-102 -59q-49 99 -144 159t-209 60v0z" /> + <glyph glyph-name="yuejuancuohao" unicode="ဆ" +d="M783 701l-271 -271l-271 271q-8 8 -18.5 8t-18.5 -7.5t-8 -18.5t8 -18l271 -272l-271 -271q-8 -8 -8 -18.5t8 -18t18.5 -7.5t18.5 7l271 272l271 -272q8 -7 18.5 -7t18.5 7.5t8 18t-8 18.5l-271 271l271 272q8 7 8 18t-8 18.5t-18.5 7.5t-18.5 -8z" /> + <glyph glyph-name="cuo" unicode="ဇ" +d="M512 822q-107 0 -198 -53t-143.5 -143.5t-52.5 -197.5t52.5 -198t143.5 -144t198 -53t198 53t143.5 144t52.5 198t-52.5 197.5t-143.5 143.5t-198 53zM702 271q6 -6 6 -14.5t-6 -14.5t-14.5 -6t-14.5 6l-161 161l-161 -161q-6 -6 -14.5 -6t-14.5 6t-6 14.5t6 14.5 +l161 161l-161 161q-6 6 -6 14.5t6 14.5t14.5 6t14.5 -6l161 -161l161 161q6 6 14.5 6t14.5 -6t6 -14.5t-6 -14.5l-161 -161z" /> + <glyph glyph-name="baobiao" unicode="" +d="M964 95v35l-37 -3v484h-236v70h-361v-70h-234v-481h-36v-35h433v-141h-91v-35h217v35h-90v141h435zM366 646h289v-35h-289v35zM365 249l-143 73l15 28l123 -64l174 160l127 -92l93 122l13 -9l12 -10l-111 -147l-132 96z" /> + <glyph glyph-name="star" unicode="" +d="M750 -84q-24 0 -45 11l-193 104l-192 -104q-24 -12 -51 -10.5t-48 15.5q-23 16 -33.5 40.5t-5.5 50.5l37 225l-162 163q-19 19 -25 44t3 50q8 25 28 41.5t47 20.5l221 33l96 199q12 24 35 38.5t50 14.5t50 -14.5t35 -38.5l96 -199l221 -33q27 -4 47 -20.5t28 -41.5 +q9 -25 3 -50t-25 -44l-162 -163l37 -225q5 -26 -5.5 -50.5t-32.5 -39.5q-25 -17 -54 -17zM512 92q7 0 13 -4l206 -111q21 -11 40 2t15 35l-40 239q-2 15 8 25l173 173q16 15 9 36q-8 20 -30 24l-236 35q-15 2 -22 15l-102 214q-10 20 -34 20t-34 -20l-102 -214 +q-7 -13 -22 -15l-236 -35q-22 -4 -30 -24q-7 -21 9 -36l173 -173q10 -10 8 -25l-40 -239q-4 -22 15 -35t40 -2l206 111q6 4 13 4zM200 439q-12 0 -14 12q-1 6 2.5 11t9.5 5l10 2q5 1 10 -2.5t6 -9.5t-2.5 -10.5t-9.5 -5.5l-9 -2h-3zM253 448q-12 0 -14 11q-2 6 1.5 11t9.5 6 +l154 30l58 133q6 13 19 7t7 -19l-61 -140q-3 -7 -10 -8l-162 -31h-2z" /> + <glyph glyph-name="yuandian" unicode="" +d="M513 831q-91 0 -174 -35.5t-143 -95.5t-95.5 -143t-35.5 -174.5t35.5 -174.5t95.5 -143t143 -95.5t174 -35.5t174 35.5t143 95.5t95.5 143t35.5 174.5t-35.5 174.5t-95.5 143t-143 95.5t-174 35.5zM513 -7q-106 0 -195.5 52t-141.5 142t-52 195.5t52 195t141.5 142 +t195.5 52.5t195.5 -52.5t141.5 -142t52 -195t-52 -195.5t-141.5 -142t-195.5 -52zM513 382zM169 382.5q0 93.5 46 173t125.5 125.5t173 46t172.5 -46t125.5 -125.5t46.5 -173t-46.5 -173t-125.5 -125.5t-172.5 -46t-173 46t-125.5 125.5t-46 173z" /> + <glyph glyph-name="kefu" unicode="" +d="M133 415q0 102 50 189t137 137.5t192 50.5t193.5 -50.5t140 -137.5t51.5 -189q0 -132 -81.5 -234t-208.5 -133l-116 -51v41q-99 7 -181 58.5t-129.5 136t-47.5 182.5zM84 415q0 -158 106 -276t263 -140q-4 -23 -6.5 -44t-0.5 -21q3 0 190 79q133 40 218.5 150.5 +t85.5 251.5q0 113 -57 209.5t-156 153t-215 56.5t-215 -56.5t-156 -153t-57 -209.5zM341 277q17 -32 64 -53.5t106 -21.5q58 0 106 21t66 52q-7 4 -15.5 7.5t-12.5 4.5q-16 -24 -55 -41.5t-87.5 -17.5t-88 17.5t-55.5 43.5z" /> + <glyph glyph-name="logo" unicode="" +d="M991 829q-5 2 -11 2q-17 0 -28 -11q-843 -424 -911 -459q-28 -15 -26 -41q2 -21 23 -28l290 -91l5 -2l17 50l-254 80l780 406q-232 -263 -436 -494q-29 -33 -29 -71v-153v0v-54v-2v0q1 -10 8.5 -17t18 -7t18 7t8.5 17v0q1 191 0 205q0 20 11 33q113 129 466 528 +q-113 -562 -128 -637q-1 -4 -4 -4h-2q-13 4 -280 85l-5 1l-17 -50l5 -2q1 0 28.5 -8.5t66.5 -20t79 -24t72 -22t39 -11.5q8 -2 15 -2q20 0 35.5 13t19.5 34q2 9 56 278q85 418 86 427l1 3q5 31 -17 42z" /> + <glyph glyph-name="list" unicode="" +d="M618 734h-397q-13 0 -22 -9t-9 -22v-638q0 -13 9 -22t22 -9h582q13 0 22 9t9 22l-1 476zM804 541h-184v165zM813 65q0 -5 -3 -8t-7 -3h-582q-4 0 -7 3t-3 8v638q0 5 3 8t7 3h378v-193h214v-456zM298 482h55v-55h-55v55zM400 468h323v-26h-323v26zM298 342h55v-55h-55v55z +M400 328h323v-27h-323v27zM298 200h55v-55h-55v55zM400 185h323v-26h-323v26zM881 53z" /> + <glyph glyph-name="tubiao" unicode="" +d="M953 232h-169l-103 121q0 1 -1 1v1h-1v1h-1v0q0 1 -1 1v0q0 1 -0.5 1h-1t-0.5 0.5v0.5h-1v1h-1h-1v0l-1 1v0q-2 1 -5 1h-1v0q-3 1 -5 1v0l-1 -1v0h-1h-1v0h-1h-0.5h-0.5h-1v-1h-1h-1v0l-4 -2v0l-1 -1q-2 -1 -4 -3v0q0 -1 -1 -1v0q0 -1 -1 -1v0v-1l-1 -1v0l-0.5 -0.5 +l-0.5 -0.5v-1v0q0 -1 -1 -1v0v-1v-1q-1 0 -1 -1v0v-1l-98 -343l-104 727v2v0v1h-1v1v0v1v1h-1v1v0v1v0l-1 1v0q0 1 -1 1v0v1v0l-1 1v1h-0.5t-0.5 0.5t-0.5 0.5t-0.5 1v0h-1v1h-1v0q0 1 -1 1v0l-1 1v0h-1v1h-1v0q-1 0 -1 1v0h-1h-1v1h-1v0q-3 1 -5 1v0h-1h-1v0h-1v0h-5v0h-1 +l-1 -1h-0.5h-0.5h-1v0l-1 -1h-1v0l-1 -1v0h-1v0l-1 -1v0h-1v0l-1 -1v0q0 -1 -1 -1v0l-0.5 -0.5l-0.5 -0.5v0l-1 -1v0l-1 -1v0q0 -1 -1 -1v0v-1h-1v-1v0q0 -1 -1 -1v0v-1v-1h-1v-1v0q0 -1 -1 -1v0v-2l-141 -509h-177q-10 0 -17.5 -7.5t-7.5 -18.5t7.5 -18.5t17.5 -7.5h192 +q1 0 2 1q2 -1 3 -1q19 0 24 19l114 411l103 -724v0v-1v0q0 -1 1 -2v0v-2v-1l1 -1v-1l1 -1v-1l1 -1v-1q1 0 2 -1v0q0 -1 1 -2v0l2 -2v0q2 -2 5 -3h1q0 -1 1 -1h1q1 -1 2 -1v0v0v0h1.5t1 -0.5t1 -0.5h0.5h3v0h1v0h0.5h1.5v0v1v0h1h1h1q1 0 1 1h1q3 1 5 2v0q2 1 3 2v1q1 0 2 1 +v0l1 1v1q1 0 1.5 0.5l0.5 0.5v2h1q0 1 1 2v0v2v0q1 1 1 2v0v0v0l118 412l80 -94v-1l0.5 -0.5l0.5 -0.5l0.5 -0.5l0.5 -0.5h0.5t0.5 -1v0q1 -1 3 -2v0h1v0q0 -1 0.5 -1h1h0.5l0.5 -0.5l0.5 -0.5h1v0q1 0 1 -1h1h1v0h1v0h1v0h2v0h1v0v0v0h181q11 0 18.5 7t7.5 18t-7.5 18.5 +t-18.5 7.5z" /> + <glyph glyph-name="right" unicode="စ" +d="M516.5 -63q-91.5 0 -175.5 35q-81 34 -143 96.5t-96 143.5q-36 83 -36 174.5t36 175.5q34 80 96 142.5t143 96.5q84 35 175.5 35t174.5 -35q81 -34 143 -96.5t97 -142.5q35 -84 35 -175.5t-35 -174.5q-35 -81 -97 -143.5t-143 -96.5q-83 -35 -174.5 -35zM516 775 +q-105 0 -194.5 -52t-141.5 -141.5t-52 -195t52 -195t141.5 -141.5t194.5 -52t194.5 52t141.5 141.5t52 195t-52 195t-141.5 141.5t-194.5 52zM435 133l-226 225l80 80l146 -146l308 308l80 -79z" /> + <glyph glyph-name="huanfu2" unicode="" +d="M959 539l-218 154h-101l-4 -10q-1 -3 -4.5 -9.5t-14.5 -21t-24.5 -26t-35 -21.5t-46.5 -10q-53 1 -93 44q-21 22 -31 44l-4 10h-100l-218 -154l104 -159l90 65l-19 -368h269h4h270l-19 368l90 -65zM730 507l21 -400h-238h-4h-236l20 400l-116 -84l-36 55l159 112l-19 31 +l-160 -112l-14 22l185 131h72q12 -24 30 -44q49 -53 117 -54v0v0h0.5h0.5v0v0q67 1 117 54q18 20 31 44h71l186 -131l-15 -22l-160 112l-19 -31l159 -112l-36 -55z" /> + <glyph glyph-name="On-line" unicode="" +d="M680 541l-249 -251l-95 94l-35 -35l112 -112q9 -9 17 -9q9 0 18 9l267 268zM512 800q-172 0 -294 -122t-122 -294t122 -294t294 -122t294 122t122 294t-122 294t-294 122zM512 3q-103 0 -191 51t-139 139t-51 191t51 191t139 139t191 51t191 -51t139 -139t51 -191 +t-51 -191t-139 -139t-191 -51z" /> + <glyph glyph-name="biaoge" unicode="" +d="M305 260zM730 427zM596 554zM144 603v-602h737v602h-737zM420 216v129h185v-129h-185zM605 173v-129h-185v129h185zM605 517v-129h-185v129h185zM374 517v-129h-184v129h184zM190 345h184v-129h-184v129zM651 345h184v-129h-184v129zM651 388v129h184v-129h-184zM190 173 +h184v-129h-184v129zM651 44v129h184v-129h-184z" /> + <glyph glyph-name="youyou" unicode="" +d="M284 722l57 59l399 -397l-399 -397l-57 59l336 338z" /> + <glyph glyph-name="zuozuo" unicode="" +d="M740 722l-57 59l-399 -397l399 -397l57 59l-336 338z" /> + <glyph glyph-name="icon5" unicode="" +d="M963 175q-13 77 -73 133q-55 52 -157 85q-5 1 -81 25q56 10 122 13h120q-43 63 -127 84q-89 23 -152 -32q30 106 -39 161q-24 19 -55 23t-56 -8q73 -39 94 -145q-66 102 -188 86q-25 -3 -52 -9.5t-62 -16.5t-52 -14q25 -23 48 -28t49 -10t57.5 -11t48.5 -9q3 -1 14 -3 +t14.5 -2.5t13 -3t14 -4t13 -4.5t13.5 -6.5t11.5 -8t11.5 -9.5q-126 38 -236 9q-69 -18 -123.5 -52.5t-71.5 -72.5q31 16 72 18.5t73 -0.5q81 -3 113 1q23 3 48.5 8t60 13t50.5 11q-24 -16 -31 -21t-28.5 -20.5t-29 -23t-24 -23.5t-22.5 -27.5t-15 -29.5t-11 -34t-2.5 -37 +t4.5 -44q20 34 51.5 67.5t60 56.5t62.5 54.5t56 59.5q-24 -134 66 -238q5 -5 30.5 -33.5t34.5 -40t24 -35.5t22 -47q18 196 -98 397l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h2l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1 +l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1 +l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l2 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1 +l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1 +h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1v-1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l2 -1l1 -1 +h1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1l1 -1h1l1 -1h1l1 -1l1 -1h1zM513 236q-37 -19 -42 -65q-3 -29 -11 -84t-11 -79q0 -6 -8 -96h80q23 183 29 230q1 11 -4 23q-4 9 -33 71z" /> + <glyph glyph-name="iconfont17" unicode="" +d="M512 -212q139 0 257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5t-257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5zM512 764q192 0 328 -136t136 -328t-136 -328t-328 -136t-328 136t-136 328t136 328t328 136zM378 451h102 +v-478q0 -14 9.5 -23t22.5 -9t22.5 9t9.5 23v478h102q13 0 17 7.5t-4 17.5l-128 173q-8 10 -19 10t-19 -10l-128 -173q-8 -10 -4 -17.5t17 -7.5z" /> + <glyph glyph-name="tianjia" unicode="" +d="M675 413h-127v127q0 15 -10.5 25.5t-25.5 10.5t-26 -10.5t-11 -25.5v-127h-127q-15 0 -25.5 -11t-10.5 -26t10.5 -25.5t25.5 -10.5h127v-127q0 -15 11 -26t26 -11t25.5 11t10.5 26v127h127q15 0 25.5 10.5t10.5 25.5t-10.5 26t-25.5 11v0zM511 831q-92 0 -176 -36 +t-145 -97t-97 -145t-36 -176.5t36 -176.5t97 -144.5t145 -96.5t176.5 -36t176.5 36t144.5 96.5t96.5 144.5t36 176.5t-36 176.5t-96.5 145t-144.5 97t-177 36v0zM511 -21q-107 0 -198.5 53.5t-145 145t-53.5 199t53.5 199t145 145t199 53.5t199 -53.5t145 -145t53.5 -199 +t-53.5 -199t-145 -145t-199.5 -53.5v0zM511 -21z" /> + <glyph glyph-name="xiazai" unicode="" +d="M511 828q-90 0 -172.5 -35t-142 -94.5t-94.5 -141.5t-35 -172.5t35 -172.5t94.5 -141.5t142 -94.5t172.5 -35t172 35t141.5 94.5t94.5 141.5t35 172.5t-35 172.5t-94.5 141.5t-141.5 94.5t-172 35zM510.5 -30q-112.5 0 -208 55.5t-151 151t-55.5 208t55.5 208t151 151 +t208 55.5t208 -55.5t151 -151t55.5 -208t-55.5 -208t-151 -151t-208 -55.5zM663 352l-125 -106v324q0 11 -8 19t-19 8t-19 -8t-8 -19v-325l-126 107q-8 8 -19 8t-19 -8t-8 -19t8 -19l170 -161q8 -9 20 -8q13 -1 21 8l170 161q8 8 8 19t-8 19t-19 8t-19 -8z" /> + <glyph glyph-name="xuanzemoban48" unicode="" +d="M320 300h-213q-27 0 -45.5 -18.5t-18.5 -45.5v-213q0 -27 18.5 -45.5t45.5 -18.5h213q27 0 45.5 18.5t18.5 45.5v213q0 27 -18.5 45.5t-45.5 18.5zM256 257v-256h-85v256h85zM85 23v213q0 9 6.5 15t15.5 6h42v-256h-42q-9 0 -15.5 6.5t-6.5 15.5zM341 23q0 -9 -6 -15.5 +t-15 -6.5h-43v256h43q9 0 15 -6t6 -15v-213zM576 471h-341q-36 0 -61 -25t-25 -61v-42h43v42q0 18 12.5 30.5t30.5 12.5h42v-96h22v96h213v-427h-85l-22 -42h171q35 0 60 25t25 60v341q0 36 -25 61t-60 25zM619 44q0 -18 -12.5 -30.5t-30.5 -12.5h-43v427h43 +q18 0 30.5 -12.5t12.5 -30.5v-341zM853 -41q36 0 61 25t25 60v512q0 35 -25 60t-61 25h-512q-35 0 -60 -25t-25 -60v-43h43v43q0 18 12.5 30.5t29.5 12.5h86v-86h21v86h299v-598h-43l-21 -42h170zM896 44q0 -18 -12.5 -30.5t-30.5 -12.5h-85v598h85q18 0 30.5 -12.5 +t12.5 -30.5v-512z" /> + <glyph glyph-name="gongju" unicode="" +d="M282 555q-20 -20 -49 -20t-49 20l-33 33l98 99l33 -33q21 -20 21 -49.5t-21 -49.5v0zM249 621v0l-33 -33q7 -7 16.5 -7t16.5 7t7 16.5t-7 16.5v0zM397 412l-147 143l32 33l147 -142l-32 -34v0zM751 50l-133 140l33 33l133 -140l-33 -33v0zM850 -16q-34 -34 -82 -34 +t-82 34l-148 154l33 33l148 -154q20 -21 49 -20.5t49.5 20.5t20.5 49.5t-21 49.5l-147 154l33 33l147 -154q34 -34 34 -82.5t-34 -82.5v0zM802 384q-48 -47 -115.5 -47t-115 47.5t-47.5 115.5t48 115l42 43l33 -33l-43 -43q-34 -34 -34 -82t34 -82.5t82.5 -34.5t82.5 34 +l42 43l33 -33l-42 -43v0zM844 427l-49 50l-17 -17q-27 -27 -65 -27v0q-39 0 -66 27t-27 66t27 66l16 17l-49 49l33 33l82 -82l-49 -50q-14 -14 -14 -33t13.5 -33t33 -14t33.5 14l49 50l82 -83l-33 -33v0zM234 45v47h46v-47h-46v0zM538 273l-92 91l33 33l92 -91l-33 -33v0z +M304 17l174 240l37 -28l-177 -244q-34 -34 -82 -34t-82 34t-34 82.5t34 82.5l3 3l240 175l28 -38l-239 -174q-20 -20 -20 -48q0 -29 21 -50q19 -19 48 -19.5t49 18.5v0z" /> + <glyph glyph-name="bianji" unicode="" +d="M769 432l-126 126l63 63q16 16 38 16t38 -16l50 -50q16 -16 16 -38t-16 -38zM403 67l-126 125l343 340l126 -126zM176 -37l77 205l125 -125z" /> + <glyph glyph-name="xiaoxi" unicode="" +d="M587 671q-10 4 -18 -3l-259 -229h-148q-7 0 -12 -5t-5 -12v-268q0 -7 5 -12t12 -5h144q7 0 12 5t5 12v252q2 1 4 3l237 209v-653l-161 138q-91 78 -94 76q-10 -7 -19 -23q-1 -2 16 -16q7 -6 17.5 -14.5t20 -16.5t18 -15.5t14 -12l5.5 -4.5l10 -8l178 -153q5 -4 11 -4 +q4 0 7 1q10 5 10 16v726q0 11 -10 16v0zM290 171h-115v234h115v-234v0zM748 292q0 -39 -24 -69.5t-61 -40.5h-4q-13 0 -16 12q-2 7 1.5 13t10.5 8q26 7 42.5 28.5t16.5 48.5t-16.5 48.5t-42.5 28.5q-7 2 -10.5 8t-2 12.5t7.5 10t13 2.5q37 -10 61 -40.5t24 -69.5v0zM865 292 +q0 -67 -34 -124t-93 -89q-4 -2 -8 -2q-10 0 -14 9q-4 6 -2 12.5t8 9.5q51 28 80 77t29 107q0 57 -29.5 106.5t-79.5 77.5q-6 3 -8 9.5t1 12.5t9.5 8t13.5 -1q59 -32 93 -89t34 -124v0z" /> + <glyph glyph-name="xiangxia" unicode="" +d="M888 620q12 12 28.5 12t28.5 -12v0q12 -12 12 -28.5t-12 -28.5l-406 -405q-12 -12 -28.5 -12t-27.5 12v0q-12 11 -12 27.5t12 28.5zM539 214q11 -12 11 -28.5t-11 -27.5v0q-12 -12 -28.5 -12t-28.5 12l-406 405q-11 12 -11 28.5t11 28.5v0q12 12 28.5 12t28.5 -12z +M539 214z" /> + <glyph glyph-name="wenjian" unicode="" +d="M887 515v-45v-45v-478q0 -29 -20 -49t-48 -20h-614q-29 0 -48.5 20t-19.5 49v705q0 28 20 48t48 20h387h45h38q14 5 23 -5l183 -183q7 -7 6 -17zM660 447q-10 0 -16.5 7t-6.5 16v205h-45h-364q-19 0 -32.5 -13.5t-13.5 -32.5v-660q0 -18 13.5 -31.5t32.5 -13.5h568 +q19 0 32.5 13.5t13.5 31.5v456v22h-182zM683 666v-173h159v14z" /> + <glyph glyph-name="layouts" unicode="" +d="M917 -103h-810q-18 0 -30 12t-12 30v698q0 18 12 30t30 12h810q18 0 30 -12t12 -30v-698q0 -18 -12 -30t-30 -12zM316 -61h601v363h-601v-363zM107 -61h167v363h-167v-363zM148.5 637q-17.5 0 -29.5 -12t-12 -29.5t12 -30t29.5 -12.5t30 12.5t12.5 30t-12.5 29.5t-30 12z +M274.5 637q-17.5 0 -29.5 -12t-12 -29.5t12 -30t29.5 -12.5t29.5 12.5t12 30t-12 29.5t-29.5 12zM400.5 637q-17.5 0 -30 -12t-12.5 -29.5t12.5 -30t30 -12.5t29.5 12.5t12 30t-12 29.5t-29.5 12zM875 512h-768v-168h810v168h-42z" /> + <glyph glyph-name="duigou" unicode="" horiz-adv-x="1600" +d="M0 -31l1 -1q-1 0 -1 1zM423 -32q0 1 1 1q0 -1 -1 -1zM1189 507q0 -7 -8 -10q-95 -40 -170.5 -108.5t-144.5 -165.5q-70 -98 -123 -216q-5 -10 -8.5 -11t-11.5 7q-59 58 -262 258q-30 29 -39 37q-7 6 -7 10.5t10 8.5q62 29 98 48q18 10 33 -5q31 -32 164 -162 +q12 -12 14.5 -11t7.5 17q27 77 97 193q107 180 274 406q0 1 2 4.5t4 4.5t4.5 0.5t3.5 -2.5t1 -5.5v-5.5q15 -69 60 -287z" /> + <glyph glyph-name="tianjia1" unicode="" +d="M510 -61q-91 0 -173.5 35.5t-142.5 95t-95.5 142.5t-35.5 174t35.5 173.5t95.5 142.5t142.5 95.5t173.5 35.5t173.5 -35.5t142.5 -95.5t95.5 -142.5t35.5 -173.5t-35.5 -174t-95.5 -142.5t-142.5 -95t-173.5 -35.5v0zM510 812q-116 0 -214 -57t-155.5 -155t-57.5 -214 +t57.5 -214.5t155.5 -155.5t214 -57t214 57t155.5 155.5t57.5 214.5t-57.5 214t-155.5 155t-214 57v0zM528 153h-36v215h-214v36h214v214h36v-214h214v-36h-214v-215v0zM528 153z" /> + <glyph glyph-name="yaoyaozhibofanye" unicode="" +d="M508.5 744q-90.5 0 -173.5 -35.5t-142.5 -95.5t-95 -142.5t-35.5 -173.5t35.5 -173.5t95 -142.5t142.5 -95.5t173.5 -35.5t173.5 35.5t143 95.5t95 142.5t35 173.5t-35 173.5t-95 142.5t-143 95.5t-173.5 35.5zM508.5 -107q-109.5 0 -202.5 54t-147.5 147t-54.5 203 +t54.5 203t147.5 147t202.5 54t203 -54t147.5 -147t54 -203t-54 -203t-147.5 -147t-203 -54zM253 401q4 13 -4.5 20.5t-20.5 5.5t-16 -14q-42 -126 14 -249q7 -11 17 -11t17.5 10.5t2.5 21.5q-47 104 -10 216zM599 164l-127 133l127 133q7 7 7 16.5t-7 16.5t-16.5 7t-16.5 -7 +l-148 -148q-7 -7 -7 -18q0 -10 7 -18l148 -148q7 -7 16.5 -7t16.5 7t7 16.5t-7 16.5z" /> + <glyph glyph-name="404" unicode="" +d="M300 300l5 2q1 -5 27 -15l5 -13q16 -37 37 -112q22 8 61 -14l2 -4l-47 -36l18 -43q3 -8 -45 -30q-17 11 -26 7l-1 3q-17 37 -17 50l-4 -2l6 -15l-11 -4q-62 -24 -91 -8l-4 -1l-2 4q-11 25 32 182q18 7 23 31q19 13 32 18v0zM216 80q43 30 38 40q-1 3 1 10l-1 2 +q-38 -32 -37 -34q-2 -14 -1 -18v0zM217 73l1 -2q17 1 28 6q1 0 20 15l-1 2q-11 -4 -15 6q-35 -23 -33 -27v0zM226 144l11 4q-1 -3 -16 -19q-3 -16 -1 -20q41 31 38 40l1 10l-4 -4l-9 -3l-1 2q17 6 21 37l-1 3q-38 -32 -37 -37l-2 -13v0zM232 173l1 -2l2 1q42 35 35 51 +q2 1 2 3h-3q-43 -33 -36 -49q-2 -2 -1 -4v0zM241 212l1 -2q20 15 66 58l3 1l-7 15l1 5l-3 -1q-55 -49 -56 -57l-5 -19v0zM312 107l-36 -14q-2 0 -16 -11l1 -2l12 2l20 8q18 7 61 46l-6 15l-3 -1q-36 -25 -31 -37q2 -4 -2 -6v0zM268 265l1 -2q26 25 28 26l-1 2l-9 -4 +q-18 -7 -19 -22v0zM276 223q24 -57 12 -90l-4 -29l27 11q-11 44 -32 106l-1 3l-2 -1v0zM279 232l7 -15q20 22 32 27l-3 9l-3 12l-2 -1q-32 -25 -31 -32v0zM293 195q36 25 29 41l-3 6h-2q-32 -29 -28 -39l4 -8v0zM294 190l3 -6l3 -12l2 1l-1 -5l7 -15l32 27l-6 16 +q-14 -16 -21 -19l-2 -1q-1 3 20 26l-3 13l-1 3l-33 -28v0zM307 148l3 -6l2 -12q36 26 34 31l-5 13q-17 -12 -34 -26v0zM356 132q-36 -27 -31 -37l1 -10q38 27 35 34q37 32 43 34l-1 2q-2 4 -14 4l-31 -31l-2 4v0zM328 81l5 -10l-1 -5h2q18 11 26 18t7 10l-5 13l-34 -26v0z +M334 61l5 -13q39 20 36 27l-4 11q-33 -23 -37 -25v0zM358 140l1 -4q8 3 11 24l-2 -1q-5 -17 -10 -19v0zM732 256h4q-1 -4 14 -20v-11q-2 -34 -13 -96q19 -1 39 -30v-4l-48 -11l-2 -37q0 -8 -44 -8q-8 14 -16 14v2q1 34 6 43h-4l-1 -13l-9 1q-56 2 -70 24h-4v4q1 22 89 124 +q15 -1 29 16q19 3 30 2v0zM588 116v-2q13 -5 23 -5q2 0 20 5l1 2q-10 0 -10 9q-34 -5 -34 -9v0zM590 121q42 8 43 17q0 3 4 7v2q-40 -11 -40 -13q-7 -9 -7 -13v0zM620 165h10q-3 -3 -18 -9q-9 -11 -9 -14q42 9 42 16l5 8l-4 -2h-8v2q14 -1 29 21v2q-39 -11 -40 -15l-7 -9v0z +M671 110l-32 1q-2 0 -16 -3v-1l10 -3l17 -1q16 0 62 14l1 13l-2 1q-36 -7 -36 -17q-1 -4 -4 -4v0zM635 185v-2h2q44 12 45 27q2 0 2 1h-2q-44 -9 -45 -24q-2 0 -2 -2v0zM686 207q-3 -50 -24 -70l-13 -20l24 -2q8 39 15 90v2h-2v0zM656 211v-2q21 5 70 21h2l1 13l2 4h-2 +q-59 -19 -62 -24l-11 -12v0zM670 68v-11q36 2 36 8v9q-33 -6 -36 -6v0zM673 85v-9l-2 -4h1q34 4 35 10v11l-34 -8v0zM712 114q-36 -8 -36 -18l-3 -7q38 8 39 13q38 12 44 11v2q-1 4 -10 8l-34 -13v4v0zM682 142v-6l-3 -9q9 1 16 3t11.5 3t6.5 2.5t2 2.5l1 11q-16 -2 -34 -7 +v0zM688 177v-6l-3 -9h2l-2 -4l-1 -13l34 10l1 13q-16 -7 -22 -7h-2q0 2 24 13l3 11v2l-34 -10v0zM688 181q36 7 37 21v6h-2q-34 -11 -34 -19l-1 -8v0zM692 213l-1 -13q24 10 34 9l1 8l2 9h-2q-33 -8 -34 -13v0zM695 241v-2q29 10 30 10v2h-7q-17 1 -23 -10v0zM716 119v-4 +q7 0 17 14l-2 1q-10 -11 -15 -11v0zM479 382q80 15 109 -24q15 -28 18 -45q18 -85 -53 -138q-18 -8 -30 -10q-48 -10 -96 33q-14 24 -18 44q-20 96 46 133l24 7v0zM410 265q9 8 16 9q-15 -14 -14 -17q-1 -8 1 -14h2q36 24 35 30l-2 10q-6 -5 -12 -7l-1 4q16 4 14 30h-2 +q-34 -25 -37 -34q-1 -4 0 -11v0zM410 286q50 33 45 57q-23 -18 -34 -27.5t-10 -10.5q-2 -14 -1 -19v0zM413 316v-2q41 31 53 49q15 3 20 16h-2q-55 -10 -71 -63v0zM414 235q4 -8 5 -14q29 23 35 24l-4 18q-9 -2 -36 -28v0zM422 220q3 -15 10 -15l27 22q0 2 -5 16 +q-25 -22 -32 -23v0zM433 199q7 -9 10 -8l4 1q17 15 25 17q-2 6 -10 15q-30 -22 -29 -25v0zM448 186l1 -3q4 1 12 -3q28 15 28 20q-9 2 -10 8q-18 -8 -31 -22v0zM469 179l1 -2l15 1l12 2q4 1 18 10v2q-11 -2 -21 5l-25 -18v0zM476 249l5 -22q5 -21 29 -32l4 1q37 51 23 119 +l-3 12l-6 19l-6 -1q-6 -1 -31 2q-25 -45 -15 -98v0zM476 363l1 -2q17 -3 20 -2q21 15 23 23l-21 -2q-4 -1 -23 -17v0zM509 363l4 3q2 0 15 -10q15 20 24 21q-1 5 -23 5q-21 -17 -20 -19v0zM512 185v-2l4 1q30 6 48 40q-15 -15 -52 -39v0zM522 198q57 36 54 53q3 7 2 11 +q-53 -40 -49 -55q-4 -1 -7 -9v0zM529 352l7 -15l2 1q7 8 27 26v2q-8 8 -9 10h-4l-23 -24v0zM537 333l4 -9v-9l4 1q29 27 29 28l-1 3q-3 13 -7 13q-26 -26 -29 -27v0zM540 236q21 15 30.5 25t8.5 14q3 11 2 15h-2l-35 -30q-5 -22 -4 -24v0zM542 307l3 -12l10 4 +q-11 -11 -10 -14q-1 -16 -1 -19q29 21 37 34l-3 12q-10 -10 -17 -11q13 17 18 18l-4 19q-30 -26 -33 -31v0zM307 569q-16 0 -20 -16q-3 -11 4 -21t26 -15v50q-5 2 -10 2v0zM710 537v-3q3 5 3 12q0 8 -6 14.5t-15 6.5q-5 0 -9 -3q11 0 19 -8t8 -19v0zM532 520q0 7 -8 19.5 +t-17 21.5l-8 8q0 -25 12 -48q-3 -5 -6.5 -13.5t-4.5 -13.5l-2 -6q33 16 34 32v0zM489 507q4 0 4 4.5t-4.5 4.5t-4.5 -4.5t5 -4.5v0zM445 630l-2 16q-2 -1 -14 0.5t-28.5 -6.5t-21.5 -25q17 19 66 15v0zM621 615q-5 17 -20.5 24.5t-29.5 7.5h-14q-1 -8 -2 -17q49 4 66 -15v0z +M420 518q22 0 38 14.5t16 35t-16 34.5t-38.5 14t-38 -14t-15.5 -34.5t15.5 -35t38.5 -14.5v0zM420 614q21 0 36 -13.5t15 -33t-15 -33t-36.5 -13.5t-36.5 13.5t-15 33t15 33t37 13.5v0zM420 534q15 0 25.5 10t10.5 23.5t-10.5 23t-25.5 9.5t-26 -9.5t-11 -23t11 -23.5 +t26 -10v0zM435 552q4 4 7 1.5t-0.5 -6.5t-6.5 -1t0 6v0zM396 586q10 10 18 3t-2 -18q-9 -10 -18 -3q-8 8 2 18v0zM584 518q23 0 38.5 14.5t15.5 35t-15.5 34.5t-38 14t-38.5 -14t-16 -34.5t16 -35t38 -14.5v0zM584 614q22 0 37 -13.5t15 -33t-15 -33t-36.5 -13.5t-36.5 13.5 +t-15 33t15 33t36 13.5v0zM584 534q15 0 25.5 10t10.5 23.5t-10.5 23t-25.5 9.5t-25.5 -9.5t-10.5 -23t10.5 -23.5t25.5 -10v0zM600 552q3 4 6 1.5t-0.5 -6.5t-6.5 -1t1 6v0zM561 586q9 10 17.5 3t-1.5 -18q-10 -10 -18 -3q-8 8 2 18v0zM957 382v0q-2 2 -2 2.5v0.5l-0.5 0.5 +t-1.5 0.5h-1q-9 13 -14 19t-19.5 15.5t-29.5 12.5v35q0 8 -5 8h-198q0 16 -1 28q19 2 31.5 13.5t12.5 28.5t-13.5 29t-32.5 13q-3 134 -7 150l-1 1q-3 4 -21 8q0 22 -12 47q4 -23 -26 -39h-1q0 4 -0.5 8.5t-5 16.5t-13 23t-26.5 25t-43 25q-2 -59 -32 -86v0l-6 -1v0v0v0v0h1 +q-1 0 -1 -1q-24 -18 -65 -18q-20 0 -44 4q-6 1 -11.5 1t-16.5 -3v0v0q-27 -6 -30 -10l-1 -1q-2 -11 -6 -151q-19 -1 -32 -13t-13 -29q0 -16 12.5 -28t31.5 -13q-1 -16 -1 -28h-181q-3 0 -6.5 -3t-3.5 -6v-97q-16 -1 -27 -5q-36 -13 -36 -60q0 -2 1 -4q-7 -13 -5 -35 +q2 -11 5 -14q-5 -10 2 -27q5 -13 22 -10q-7 -13 11 -29h3.5t4.5 2t5.5 4t6.5 5t6 5v-267q0 -6 11 -6h752q5 0 5 6v313q24 2 38 20q8 11 9 17q60 40 21 97v0zM316 509q-17 0 -28.5 10.5t-11.5 25.5q0 16 12 26.5t30 10.5v3v-1v-2h0.5h0.5h2v1q11 2 19 4q5 15 13.5 31t14.5 24 +l6 9q-9 29 -13 67q24 -41 82 -56.5t115.5 -2t82.5 47.5q-2 -15 -5.5 -29t-5.5 -21l-2 -6q24 -29 34 -64q2 -1 6.5 -1.5t7.5 -0.5t5 -1v3h1q17 0 29.5 -12t12.5 -27t-11 -26q-15 -10 -41 -10l2 -35h-356q0 5 0.5 15t0.5 15v2h-3v0zM127 463q0 3 3.5 6t6.5 3h742q5 0 5 -9v-29 +q0 2 -10 1q-48 -5 -61 -10h-637l-1 -2v-60q-16 8 -48 7v93v0zM821 -14h-640v297q16 6 15 22q-1 12 -15 16v8q2 1 3 2t1.5 2.5l0.5 1.5q9 17 -5 24v56h615q-5 -10 -5 -12q-2 -11 -2 -29l-91 -59q-1 0 -3 -1t-6.5 -5t-6.5 -7.5t-3.5 -9t2.5 -9.5q15 -23 51 -1q49 30 64 41v-1 +v0l-3 -2q-9 -6 -4.5 -22t20.5 -19q2 -1 5.5 -0.5t3.5 1.5v-294h3v0zM178 271q0 5 -5 8l5 2v-10v0zM178 323h-2h-1l3 2v-2v0zM879 -66h-742q-10 0 -10 7v266q1 0 6 3q16 7 25.5 17.5t0.5 15.5h-1h-1q18 7 18 21v-289l655 2v292q17 -16 35 -10q4 -9 19 -10v-308q0 -7 -5 -7v0z +M879 -66z" /> + <glyph glyph-name="lunbozutu" unicode="" +d="M1002 60v468q0 19 -12 34t-30 15h-64l1 7q0 23 -17 40t-41 17h-653q-23 0 -40.5 -19.5t-17.5 -44.5v1h-61q-19 0 -32 -13t-13 -31v-468h-1q0 -18 13.5 -31t32.5 -13h61v-5q0 -24 17 -41t41 -17h653q56 0 57 42h64q17 0 30 19.5t13 39.5h-1zM128 65h-64v470h64v-470z +M853 23q0 -5 -8 -13.5t-13 -8.5h-640q-5 0 -13 8.5t-8 13.5v554q0 5 5.5 12t9.5 7l6 3h640q5 0 13 -8.5t8 -13.5v-554zM960 44h-64v491l61 2h3v0v-2v-470q0 -1 1 -7t1 -10t-2 -4zM412.5 316q32.5 0 56 22.5t23.5 54.5t-23.5 55t-56 23t-56 -23t-23.5 -55t23.5 -54.5 +t56 -22.5zM412.5 432q16.5 0 28 -11.5t11.5 -27.5t-11.5 -27t-28 -11t-28 11t-11.5 27t11.5 27.5t28 11.5zM786 373q-34 -8 -61.5 -22.5t-48.5 -36.5t-31.5 -36.5t-26.5 -38.5q-21 -33 -34.5 -46t-30.5 -13v0q-17 0 -33 5t-23.5 9t-24.5 14q-16 10 -25.5 15t-27 10t-35.5 5 +q-26 0 -55.5 -13.5t-54 -35t-36.5 -33.5t-20 -22l-5 -51q0 -8 6 -13t14 -5h558q8 0 14 5t6 13v272q0 9 -8 15t-17 3zM771 105h-518q85 95 131 95q28 0 67 -25q18 -10 28 -15.5t30.5 -11.5t41.5 -6l3 -1q17 0 31 6t26.5 19t20 22.5t19.5 29.5q24 37 50.5 61.5t69.5 40.5v-215 +z" /> + <glyph glyph-name="help" unicode="" +d="M690 742q-74 56 -195 56q-93 0 -151 -39q-88 -60 -88 -217h154q0 2 -0.5 14t0 16t1 13.5t2 15.5t4.5 13.5t7 13.5q29 47 80 47q30 0 48 -8.5t34 -27.5q23 -29 23 -72q0 -28 -26 -63q-11 -16 -30 -30q-9 -6 -23.5 -15.5t-45 -35t-43.5 -46.5q-28 -45 -31 -130 +q-1 -12 14 -12h124q13 0 14 13q2 43 6 59q10 32 40 54l41 29q67 52 81 72q38 52 38 114q0 107 -78 166zM484 156q-40 1 -67.5 -24.5t-29 -66.5t25 -67.5t66.5 -27.5q41 -1 68.5 23.5t28.5 66t-25 68t-67 28.5z" /> + <glyph glyph-name="daima1" unicode="" horiz-adv-x="1025" +d="M513.5 810q-103.5 0 -198.5 -40.5t-163 -109t-108.5 -163t-40.5 -198.5t40.5 -198.5t108.5 -163t163 -109t198.5 -40.5t198.5 40.5t163 109t108.5 163t40.5 198.5t-40.5 198.5t-108.5 163t-163 109t-198.5 40.5zM513.5 -167q-94.5 0 -181 36.5t-149 99t-99.5 149 +t-37 181.5t37 181t99.5 148.5t149 99.5t181 37t181 -37t149 -99.5t99.5 -148.5t37 -181t-37 -181.5t-99.5 -149t-149 -99t-181 -36.5zM172 276l242 -104v45l-192 80l192 78v45l-242 -102v-42zM443 109h36l106 379h-36zM613 420v-45l192 -78l-192 -80v-45l242 104v42z" /> + <glyph glyph-name="jinshui" unicode="" +d="M862 -50q-44 0 -75.5 32t-31.5 78q0 28 14 53v1l80 137v0l13 22l14 -22v0l79 -136q1 -1 1 -2q14 -25 14 -53q0 -46 -31.5 -78t-76.5 -32v0zM924 105v0l-62 114l-61 -114h-1q-9 -19 -9 -40q0 -33 21 -56t50.5 -23t50.5 23t21 56q0 21 -10 40v0zM683 309q-67 0 -114.5 50 +t-47.5 121q0 45 21 84q0 1 1 1l120 212v0l20 35l20 -35v0l119 -210l2 -4q20 -39 20 -83q0 -71 -47 -121t-114 -50v0zM791 546v1l-108 193l-109 -193v-1q-17 -31 -17 -57q0 -57 37 -100.5t89 -43.5t88.5 39.5t36.5 94.5q0 36 -17 67v0zM539 193q2 -3 3 -6q33 -61 33 -131 +q0 -111 -76.5 -189.5t-184 -78.5t-184 78.5t-76.5 189.5q0 71 34 132q0 2 1 3l193 332v0l32 55l32 -55v0l193 -330v0zM314 507l-194 -333q-1 -1 -1 -2q-31 -54 -31 -116q0 -96 66.5 -164t160 -68t159.5 68t66 164q0 62 -30 116q-1 1 -1 2l-195 333v0z" /> + <glyph glyph-name="guanyu" unicode="" +d="M514 835q-92 0 -175.5 -36t-144 -96.5t-96.5 -144t-36 -175.5t36 -175.5t96.5 -144t144 -96.5t175.5 -36t176 36t144.5 96.5t96 144t35.5 175.5t-35.5 175.5t-96 144t-144.5 96.5t-176 36zM514.5 -20q-109.5 0 -202.5 54t-147 146.5t-54 202t54 202.5t147 147t202.5 54 +t202 -54t146.5 -147t54 -202.5t-54 -202t-146.5 -146.5t-202 -54zM514 594q-14 -16 -14 -38q0 -18 12 -30q11 -12 29 -12q20 0 36 16q14 17 14 38q0 18 -11 30q-13 13 -32.5 12t-33.5 -16zM549 293q-14 -14 -26 -23q6 29 28 103q18 63 18 73q0 13 -10 22q-22 18 -69 -8 +q-24 -14 -54 -47l-11 -11l35 -27l9 9q8 9 20 19q-39 -128 -39 -164q0 -16 10 -27q9 -10 25 -10q15 0 36 11q19 11 59 49l11 10l-31 31z" /> + <glyph glyph-name="xiangshang" unicode="" +d="M514 539l384 -384q9 -9 22 -9t22.5 9.5t9.5 22t-10 22.5l-403 403q-13 13 -25 13q-20 0 -26 -6l-410 -410q-9 -10 -9 -22.5t9.5 -22t22.5 -9.5t22 9z" /> + <glyph glyph-name="bofang" unicode="" +d="M512 -128q-104 0 -199 40.5t-163.5 109t-109 163.5t-40.5 199t40.5 199t109 163.5t163.5 109t199 40.5t199 -40.5t163.5 -109t109 -163.5t40.5 -199t-40.5 -199t-109 -163.5t-163.5 -109t-199 -40.5zM512 864q-98 0 -186.5 -38t-153 -102.5t-102.5 -153t-38 -186.5 +t38 -186.5t102.5 -153t153 -102.5t186.5 -38t186.5 38t153 102.5t102.5 153t38 186.5t-38 186.5t-102.5 153t-153 102.5t-186.5 38zM640 181h-21q-18 0 -30.5 12.5t-12.5 30.5v320q0 18 12.5 30.5t30.5 12.5h21q18 0 30.5 -12.5t12.5 -30.5v-320q0 -18 -12.5 -30.5 +t-30.5 -12.5zM405 181h-21q-18 0 -30.5 12.5t-12.5 30.5v320q0 18 12.5 30.5t30.5 12.5h21q18 0 30.5 -12.5t12.5 -30.5v-320q0 -18 -12.5 -30.5t-30.5 -12.5z" /> + <glyph glyph-name="riqi" unicode="" +d="M933 674h-167v57h-34v-57h-192v57h-34v-57h-217v57h-33v-57h-168q-9 0 -15.5 -6.5t-6.5 -15.5v-706q0 -10 6.5 -16.5t15.5 -6.5h845q9 0 15.5 6.5t6.5 16.5v706q0 9 -6.5 15.5t-15.5 6.5zM939 -54q0 -6 -6 -6h-845q-6 0 -6 6v706q0 6 6 6h168v-56h33v56h217v-56h34v56 +h192v-56h34v56h167q6 0 6 -6v-706zM207 524h129v-94h-129v94zM459 524h129v-94h-129v94zM685 524h129v-94h-129v94zM207 349h129v-94h-129v94zM459 349h129v-94h-129v94zM685 349h129v-94h-129v94zM207 174h129v-94h-129v94zM459 174h129v-94h-129v94zM685 174h129v-94h-129 +v94z" /> + <glyph glyph-name="wenjian1" unicode="" +d="M893.5 644.5q-32.5 32.5 -77.5 32.5h-353l-120 95l-11 9h-14h-142q-39 0 -66.5 -28t-27.5 -68v-255v-7v-341q0 -46 32.5 -78t77.5 -32h624q45 0 77.5 32t32.5 78v485q0 45 -32.5 77.5zM176 740h142l131 -104h367q28 0 48.5 -20.5t20.5 -48.5v-120h-762v238q0 23 15.5 39 +t37.5 16zM816 13h-624q-28 0 -48.5 20t-20.5 49v324h762v-324q0 -29 -20.5 -49t-48.5 -20z" /> + <glyph glyph-name="delete" unicode="" +d="M739 24h-452q-20 0 -34.5 14.5t-14.5 33.5v418q0 20 14.5 34.5t34.5 14.5h452q20 0 34.5 -14.5t14.5 -34.5v-418q0 -19 -14.5 -33.5t-34.5 -14.5zM287 495q-7 0 -7 -5v-418q0 -4 7 -4h452q7 0 7 4v418q0 5 -7 5h-452zM832 496h-640q-21 0 -35.5 13.5t-14.5 31.5v61 +q0 19 14.5 32t35.5 13h640q21 0 35.5 -13t14.5 -32v-61q0 -18 -14.5 -31.5t-35.5 -13.5zM185 541q1 -3 7 -3h640q6 0 7 3v61q-1 3 -7 3h-640q-6 0 -7 -3v-61zM601 605h-175q-20 0 -34.5 13.5t-14.5 31.5v11q0 19 14.5 32t34.5 13h175q20 0 34.5 -13t14.5 -32v-11 +q0 -18 -14.5 -31.5t-34.5 -13.5zM419 650q2 -2 7 -2h175q5 0 7 2v11q-2 3 -7 3h-175q-5 0 -7 -3v-11zM404 431h-30q-5 0 -9 -4t-4 -9v-273q0 -5 4 -9t9 -4h30q6 0 9.5 4t3.5 9v273q0 5 -3.5 9t-9.5 4zM660 431h-31q-5 0 -9 -4t-4 -9v-273q0 -5 4 -9t9 -4h31q5 0 9 4t4 9v273 +q0 5 -4 9t-9 4zM532 431h-30q-6 0 -9.5 -4t-3.5 -9v-273q0 -5 3.5 -9t9.5 -4h30q5 0 9 4t4 9v273q0 5 -4 9t-9 4z" /> + <glyph glyph-name="bofangzanting02" unicode="" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5v0v0zM512 -95q-98 0 -187 37.5t-153 101.5t-101.5 153t-37.5 187t37.5 187t101.5 153t153 101.5t187 37.5 +t187 -37.5t153 -101.5t101.5 -153t37.5 -187t-37.5 -187t-101.5 -153t-153 -101.5t-187 -37.5v0v0zM733 392l-340 197q-6 6 -12 0q-3 0 -5.5 -2.5t-2.5 -5.5v-394l4 -8q6 -6 12 0l344 197q4 4 4 8q3 3 1.5 5.5t-5.5 2.5v0v0zM733 392z" /> + <glyph glyph-name="top" unicode="" +d="M812 153l-300 173l-300 -173l300 604zM264 209l248 143l248 -143l-248 499zM372 138v-126h-16v126h-46v15h107v-15h-45v0zM507 154q40 0 50 -11.5t10 -58.5q0 -50 -10 -61.5t-50.5 -11.5t-50 11.5t-9.5 60.5v10v13q0 28 12 38q13 10 48 10zM506 141q-33 0 -38.5 -7.5 +t-5.5 -51t5.5 -51t39 -7.5t39 7.5t5.5 51.5v9v13q0 23 -7.5 29.5t-37.5 6.5zM608 12v141h60h5q24 0 32.5 -9t8.5 -35q0 -24 -9 -32.5t-34 -8.5h-6h-41v-56h-16zM624 81h38q24 0 30.5 5t6.5 22q0 21 -4.5 26.5t-21.5 5.5h-6h-43v-59v0z" /> + <glyph glyph-name="haoyouqingqiu" unicode="" +d="M672 766q9 -38 8 -95q0 -1 -3.5 -40.5t-2.5 -49.5q1 -7 2 -11t4 -9t5 -9q11 -24 3 -72q-5 -26 -13 -39q-3 -5 -14 -10.5t-14 -12.5q-6 -10 -7 -32t-3 -30q-3 -8 -14 -22t-11 -30q19 -3 25 -4q25 -57 39 -67q21 -6 39 -11q26 -11 76.5 -34t65.5 -29q9 -4 31 -12t33 -13.5 +t24 -17.5t18 -28q0 -10 1.5 -65.5t1.5 -79.5h-908q0 24 1 79.5t1 65.5q5 16 18 28t24.5 17.5t33.5 13.5t31 12q14 6 65 29t77 34q18 5 39 11q13 10 39 67l19 5q-3 14 -13 25.5t-12 18.5q-1 6 -7 78q0 -1 -4.5 0t-9 2.5t-6.5 1.5q-6 5 -11 14t-8 24t-4 24t-2 26.5t-1 18.5 +q-1 4 6 18t4 27q-19 94 2.5 159t69.5 81q22 10 38 15t44 10.5t56 0t53 -21.5l18 -18l29 -5q7 -4 13 -13.5t8 -17.5z" /> + <glyph glyph-name="weibiaoti1" unicode="" +d="M960 640l-45 45l-544 -512l-262 281l-45 -44l294 -327l7 7l6 -7z" /> + <glyph glyph-name="chuangkou" unicode="" +d="M96 724v-684h832v684h-832zM884 84h-744v406h744v-406z" /> + <glyph glyph-name="comiisbiaoqing" unicode="" +d="M511.5 832q-90.5 0 -173.5 -35.5t-143 -95.5t-95.5 -143t-35.5 -174t35.5 -174t95.5 -143t143 -95.5t173.5 -35.5t173.5 35.5t143 95.5t95.5 143t35.5 174t-35.5 174t-95.5 143t-143 95.5t-173.5 35.5zM511.5 -26q-111.5 0 -206 55t-149.5 149.5t-55 205.5t55 205.5 +t149.5 149.5t206 55t206 -55t149.5 -149.5t55 -205.5t-55 -205.5t-149.5 -149.5t-206 -55zM724.5 282.5q-7.5 2.5 -14.5 -1t-9 -10.5q-22 -60 -74 -96.5t-115 -36.5q-64 0 -116 37t-73 97q-3 7 -10 10.5t-14 1t-10.5 -9.5t-1.5 -15q26 -71 87.5 -114.5t137.5 -43.5 +q75 0 136.5 43.5t87.5 113.5q2 8 -1 15t-10.5 9.5zM302 494q0 -18 13.5 -31.5t32 -13.5t31.5 13.5t13 32t-13 31.5t-31.5 13t-32 -13t-13.5 -32v0zM631 494q0 -18 13.5 -31.5t32 -13.5t31.5 13.5t13 32t-13 31.5t-31.5 13t-32 -13t-13.5 -32v0z" /> + <glyph glyph-name="zhengque" unicode="" +d="M512 832q-91 0 -174 -35.5t-143 -95.5t-95.5 -143t-35.5 -174t35.5 -174t95.5 -143t143 -95.5t174 -35.5t174 35.5t143 95.5t95.5 143t35.5 174t-35.5 174t-95.5 143t-143 95.5t-174 35.5zM433 160l-186 252l68 61l118 -129l291 264l53 -56z" /> + <glyph glyph-name="iconfontwodehaoyou" unicode="" horiz-adv-x="1449" +d="M1383 -40l-3 26l-7 31l-10 30l-14 31l-14 23l-20 23l-22 18l-30 17l-22 10l-29 7l-29 7l-25 10l-31 14l-25 12l-31 14l-23 14v83l10 11l9 16l7 16l6 19l6 24l2 18l4 -1l6 1l6 4l5 9l4 11l2 14l3 24l1 21l-1 18l-4 11l-7 4l-4 -1l3 24l3 28l1 25v21l-3 18l-6 19l-8 16 +l-11 19l-12 16l-15 12l-19 12l-23 11l-20 5l-24 4l-23 1l-24 -4l-23 -8l-21 -9l-17 -11l-17 -15l-16 -17l-14 -20l-10 -22l-6 -25l-1 -32l3 -30l4 -38h-8l-6 -7l-1 -13l1 -30l4 -34l3 -17l6 -10l10 -5l6 1l4 -28l4 -16l6 -18l9 -18l10 -14l8 -10l-1 -85l8 -3l12 -3l12 -5 +l12 -4l11 -4l9 -5l12 -5l13 -7l13 -8l11 -8l13 -10l12 -11l11 -14l12 -15l13 -17l10 -21l9 -22l9 -21l5 -19l4 -20l4 -23l2 -27l1 -18l-1 -16l-4 -13l-7 -13l-8 -9l-15 -8h309l14 7l11 11l7 12l2 15zM439 816l-18 -19l-15 -22l-11 -24l-7 -28l-1 -35l3 -32l5 -43h-10l-6 -7 +l-1 -14l1 -33l5 -38l3 -19l6 -10l11 -6l7 1l4 -30l5 -18l7 -20l9 -20l11 -15l9 -11l-1 -93l-15 -10l-34 -16l-35 -16l-29 -13l-22 -10l-25 -8l-26 -5l-25 -6l-26 -11l-24 -12l-21 -15l-24 -25l-17 -24l-13 -25l-11 -25l-10 -30l-5 -23l-4 -20l-3 -23v-20l3 -21l11 -14 +l15 -10l20 -2h861l15 8l13 12l7 13l2 16l-2 22l-3 28l-8 34l-11 33l-16 34l-15 25l-22 25l-24 20l-33 19l-24 11l-32 8l-32 8l-27 10l-35 16l-27 13l-34 16l-26 14v92l11 12l11 18l8 17l6 21l6 26l3 20l4 -1l7 1l6 5l6 10l4 12l3 15l2 27l2 23l-2 19l-4 13l-8 4l-4 -1l4 26 +l3 31l1 28v22l-4 21l-6 20l-9 18l-12 21l-13 17l-16 13l-21 13l-26 13l-22 5l-26 5h-26l-26 -4l-25 -9l-23 -9l-19 -13z" /> + <glyph glyph-name="wenjianxiazai" unicode="" +d="M187 77v582q24 -24 57 -24h560v-151h25v176h-585q-23 0 -40 17t-17 40.5t17 40.5t40 17h573v25h-573q-34 0 -58 -24t-24 -58v-641q0 -31 22 -53.5t54 -22.5h226v25h-226q-21 0 -36 15t-15 36zM237 730h560v-25h-560v25zM686 428q-64 0 -118 -37.5t-76 -98.5 +q-23 -61 -5.5 -125t67.5 -105.5t116.5 -46.5t122.5 29q56 33 82.5 93.5t13.5 124.5q-14 72 -72 119t-131 47zM686 39q-57 0 -104 33t-67 86q-20 54 -4.5 110.5t60 93t102.5 41t107 -25.5t72.5 -83.5t12.5 -109.5q-13 -62 -64 -103.5t-115 -41.5zM699 152v159h-25v-159 +l-69 69l-18 -18l99 -99l99 99l-18 18z" /> + <glyph glyph-name="tupian" unicode="" +d="M959 63h-893v638h893v-638zM98 95h829v574h-829v-574zM649 398h-2q-36 0 -61.5 25.5t-25.5 60.5v2q0 36 25.5 61.5t61.5 25.5h2q36 0 61 -25.5t25 -61.5v-2q0 -35 -25 -60.5t-61 -25.5zM647 541q-23 0 -39 -16t-16 -39v-2q0 -22 16 -38t39 -16h2q22 0 38.5 16t16.5 38v2 +q0 23 -16.5 39t-38.5 16h-2zM91 160l-23 23l275 279l22 -22zM605 195l-265 264l23 23l264 -265zM619 181l-23 23l168 171l23 -23zM926 201l-167 168l22 22l167 -167z" /> + <glyph glyph-name="lianjie" unicode="" +d="M262 -122q-102 0 -179 77t-77 182.5t77 182.5l135 134l89 -89l-134 -135q-39 -38 -39 -89t38.5 -89.5t90 -38.5t89.5 38l179 179q39 39 39 90q0 47 -32 90l-71 64l90 89l70 -70q71 -71 71 -179q0 -112 -77 -180l-179 -179q-33 -37 -81.5 -57t-98.5 -20zM467 205l-70 64 +q-77 77 -77 182.5t77 182.5l179 179q77 77 182.5 77t182.5 -77t77 -182.5t-77 -182.5l-135 -134l-89 89l134 135q39 38 39 89t-38.5 89.5t-92 38.5t-87.5 -38l-186 -173q-38 -38 -38 -89.5t38 -89.5l71 -71z" /> + <glyph glyph-name="jilu" unicode="" +d="M828 700.5q-63 63.5 -145 97t-171.5 33.5t-171.5 -33.5t-145 -97t-97 -145t-34 -171.5q0 -133 72 -244q7 -11 20 -13.5t23.5 4.5t13.5 19.5t-4 23.5q-63 95 -63 210q0 104 51.5 193t140.5 140.5t193.5 51.5t193.5 -51.5t140.5 -140.5t51.5 -193.5t-51.5 -193t-140.5 -140 +t-193 -51.5q-108 0 -200 55q-11 7 -23.5 3.5t-19 -14.5t-3.5 -23.5t14 -18.5q107 -65 232 -65q89 0 171 34t145 97.5t97 145t34 171.5t-34 171.5t-97 145zM494.5 690q-16.5 0 -28 -11.5t-11.5 -27.5v-284v-2v-2q2 -15 13 -24.5t27 -9.5v0v0h224q16 0 27.5 12t11.5 28 +t-11.5 27.5t-27.5 11.5h-185v243q0 16 -11.5 27.5t-28 11.5z" /> + <glyph glyph-name="liucheng" unicode="" +d="M512 640h9h117h138h117q24 0 41 -12.5t23 -33.5q2 -9 2 -20v-509q0 -28 -18.5 -46.5t-46.5 -18.5h-763q-29 0 -47.5 18.5t-18.5 47.5v636q0 29 18.5 47.5t47.5 18.5h314q30 0 48.5 -18.5t18.5 -47.5v-55v-7zM129 640h319v64h-319v-64z" /> + <glyph glyph-name="fontstrikethrough" unicode="" +d="M928 448h-144q-5 84 -29 145q-12 29 -37 58.5t-61.5 56.5t-87 43.5t-105.5 16.5h-208v-320h-160q-13 0 -22.5 -9.5t-9.5 -22.5t9.5 -22.5t22.5 -9.5h160v-320h230q55 0 103 16t80 42t52.5 53.5t32.5 55.5q27 70 31 153h143q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5z +M349 711h64q3 0 9 1q10 2 26 0t35 -2.5t40.5 -8.5t42.5 -18t40.5 -31t35 -47.5t26 -67t12.5 -89.5h-331v263zM439 121h-90v262v1h331q-3 -55 -17 -99.5t-31.5 -71t-44 -46t-45.5 -28.5t-45.5 -13.5t-35 -4.5h-22.5z" /> + <glyph glyph-name="unlink" unicode="" +d="M150 768q-12 -4 -18.5 -16t-2.5 -25q3 -8 9 -13l123 -123q7 -11 20 -14t24 4t14 20t-4 24q-4 6 -10 10l-123 123q-11 12 -28 10h-4v0zM406 831q-10 -3 -16 -12t-6 -20v-127q0 -13 9.5 -22.5t22.5 -9.5t22.5 9.5t9.5 22.5v127q0 14 -9 23.5t-22 9.5q-3 0 -7 -1q-2 1 -4 0 +v0zM91 512q-13 -2 -21 -13t-6 -24t13 -21t24 -6h123q13 0 22.5 9.5t9.5 22.5t-9.5 22.5t-22.5 9.5h-123h-6h-4v0zM795 320q-13 -2 -21 -10.5t-6 -21.5q3 -14 14 -24t23 -8h123q13 0 22.5 11.5t9.5 25.5q0 13 -9 20t-23 7h-123h-6h-4v0zM598 127q-10 -3 -16 -12t-6 -20v-127 +q0 -13 9.5 -22.5t22.5 -9.5t22.5 9.5t9.5 22.5v127q0 14 -9 23.5t-22 9.5q-3 0 -7 -1q-2 1 -4 0v0zM726 192q-12 -4 -18.5 -16t-2.5 -25q3 -8 9 -13l123 -123q7 -11 19.5 -14t24 4t14.5 19.5t-4 24.5q-4 6 -10 10l-123 123q-11 12 -28 10h-4v0v0zM340 28q-80 0 -136 56 +t-56 135.5t56 136.5l88 87q9 10 22.5 10t23 -9.5t9.5 -22.5t-10 -23l-88 -88q-37 -37 -37 -90t37.5 -90.5t90.5 -37.5t90 37l88 88q10 10 23 10t22.5 -9.5t9.5 -23t-10 -22.5l-87 -88q-56 -56 -136 -56zM702 324q-13 0 -22.5 9t-9.5 22.5t9 22.5l88 88q38 37 38 90.5 +t-37.5 90.5t-90.5 37t-91 -37l-88 -88q-9 -9 -22 -9t-22.5 9.5t-9.5 22.5t9 23l88 87q56 56 135.5 56t136 -56t56.5 -135.5t-57 -135.5l-87 -88q-10 -9 -23 -9z" /> + <glyph glyph-name="bianjiwenzi" unicode="" horiz-adv-x="1063" +d="M945 197h-88l-116 -325h74l17 62h135l18 -62h77l-117 325v0zM848 1l51 152l51 -152h-102v0zM210 490l-27 23l-171 -199q-13 -16 -11.5 -37t17 -34.5t36.5 -12t35 17.5l11 13q12 12 24 1q13 -11 2 -23q-15 -17 -18.5 -43t11.5 -41q17 -13 42.5 -6t40.5 24q5 5 12 5.5 +t12 -4t5.5 -11.5t-3.5 -12q-15 -17 -18.5 -43t11.5 -41q17 -13 42.5 -6t40.5 24q5 5 12 5.5t12 -4.5q13 -11 2 -23q-15 -17 -18.5 -43t11.5 -41q17 -12 42.5 -5.5t40.5 23.5q11 12 24 1q5 -4 5.5 -11t-4.5 -12q-14 -17 -17.5 -43t11.5 -41q16 -14 37 -12.5t34 17.5l171 200 +l-8 37l-449 357v0zM844 330l-164 141l250 244l10 10q28 32 25.5 74.5t-35 70.5t-75.5 25.5t-71 -34.5h-1l-219 -290l-164 143q-11 9 -25.5 8t-23.5 -12l-103 -116l-23 -26l26 -23l445 -384l30 -24l121 144q10 11 9 25t-12 24v0zM818 831q16 18 40 19.5t42 -14t20 -39.5 +t-14 -42t-40 -19.5t-42.5 14t-20 39.5t14.5 42v0zM765 758q6 -27 27 -45t49 -19l-197 -199l-51 43l172 220v0zM776 300l-66 -81l-402 347l69 79q11 12 23 2l374 -324q6 -4 6.5 -11t-4.5 -12v0z" /> + <glyph glyph-name="sanjiao" unicode="" +d="M293 728l427 -355l-427 -356v711z" /> + <glyph glyph-name="danxuankuanghouxuan" unicode="" +d="M512 848q-94 0 -180 -36.5t-148.5 -99t-99 -148.5t-36.5 -180t36.5 -180t99 -148.5t148.5 -99t180 -36.5t180 36.5t148.5 99t99 148.5t36.5 180t-36.5 180t-99 148.5t-148.5 99t-180 36.5zM512 -16q-109 0 -201 53.5t-145.5 145.5t-53.5 201t53.5 201t145.5 145.5 +t201 53.5t201 -53.5t145.5 -145.5t53.5 -201t-53.5 -201t-145.5 -145.5t-201 -53.5z" /> + <glyph glyph-name="danxuankuangxuanzhong" unicode="" +d="M512 384zM320 383.5q0 79.5 56.5 136t136 56.5t135.5 -56.5t56 -136t-56 -135.5t-135.5 -56t-136 56t-56.5 135.5zM512 848q-94 0 -180 -36.5t-148.5 -99t-99 -148.5t-36.5 -180t36.5 -180t99 -148.5t148.5 -99t180 -36.5t180 36.5t148.5 99t99 148.5t36.5 180t-36.5 180 +t-99 148.5t-148.5 99t-180 36.5zM512 -16q-109 0 -201 53.5t-145.5 145.5t-53.5 201t53.5 201t145.5 145.5t201 53.5t201 -53.5t145.5 -145.5t53.5 -201t-53.5 -201t-145.5 -145.5t-201 -53.5z" /> + <glyph glyph-name="juzhongduiqi" unicode="" +d="M992 448h-960q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM800 704q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h576zM992 832h-960q-13 0 -22.5 9.5 +t-9.5 22.5t9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM224 256q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-576zM32 128h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-960 +q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM224 -64h576q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5z" /> + <glyph glyph-name="youduiqi" unicode="" +d="M992 64h-960q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM992 256h-704q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h704q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM992 448h-960q-13 0 -22.5 9.5 +t-9.5 22.5t9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM992 640h-704q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h704q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM992 832h-960q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h960 +q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM288 -64h704q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-704q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5z" /> + <glyph glyph-name="zuoduiqi" unicode="" +d="M992 448h-960q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM32 704h704q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-704q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM992 832h-960q-13 0 -22.5 9.5 +t-9.5 22.5t9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5zM32 320h704q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-704q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM32 128h960q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-960 +q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM32 -64h704q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-704q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5z" /> + <glyph glyph-name="gongsisvgtubiaozongji22" unicode="" +d="M79 832h864q6 0 11 -4.5t5 -11.5v-863q0 -7 -5 -11.5t-11 -4.5h-864q-7 0 -11.5 4.5t-4.5 11.5v863q0 7 4.5 11.5t11.5 4.5v0zM927 800h-832v-831h832v831z" /> + <glyph glyph-name="gongsisvgtubiaozongji23" unicode="" +d="M80 832h864q6 0 10.5 -4.5t4.5 -11.5v-863q0 -7 -4.5 -11.5t-10.5 -4.5h-864q-7 0 -11.5 4.5t-4.5 11.5v863q0 7 4.5 11.5t11.5 4.5v0zM928 800h-832v-831h832v831zM144 361q-11 12 0 23t22 0l11 -11l0.5 -0.5l0.5 -0.5l207 -206l472 471q11 12 22.5 0.5t0.5 -22.5 +l-484 -483v0q-11 -11 -22 0l-218 217l-1 1z" /> + <glyph glyph-name="shuaxin" unicode="ဂ" +d="M959 451q-22 147 -127.5 252.5t-252.5 127.5q-70 11 -140 -1q-70 -11 -134 -44q-7 -4 -10 -12t1 -15.5t12 -10t16 1.5q120 62 252 41t227 -116q72 -73 102 -169t12 -195q-24 42 -86 88q-5 4 -11.5 6.5t-13.5 0.5t-8 -12q-1 -3 9 -19t24.5 -40.5t21.5 -45.5 +q13 -34 17 -66.5t6 -39.5q0 -2 1 -4v0q4 -13 16 -14.5t16 6.5h1q3 3 4 6q33 64 44 134q12 70 1 140zM700 18q-120 -62 -252 -41t-227 116q-72 73 -102 169t-12 195q25 -45 88 -92q5 -4 11.5 -6.5t13.5 0t8 11.5q1 4 -9 19.5t-24.5 40.5t-21.5 46q-13 35 -17 66.5t-7 42.5 +q-2 7 -6 10q-3 3 -6 5q-7 4 -15 1t-12 -10q-33 -64 -44 -134q-12 -70 -1 -140q22 -147 127.5 -252.5t252.5 -127.5q70 -11 140 1q70 11 134 44q7 4 10 12t-1 15.5t-12 10t-16 -1.5z" /> + <glyph glyph-name="loading2" unicode="" +d="M538 832q-11 0 -18.5 -7.5t-7.5 -18t7.5 -18t18.5 -7.5q100 0 185.5 -50t135 -135.5t49.5 -185.5q0 -11 7.5 -18.5t18.5 -7.5t18.5 7.5t7.5 18.5q0 114 -57 211.5t-154 154t-211 56.5z" /> + <glyph glyph-name="jiacu" unicode="" +d="M199 848h355q106 0 158 -8.5t92.5 -36.5t68 -74.5t27.5 -104.5q0 -62 -33.5 -114.5t-90.5 -78.5q81 -23 124.5 -80t43.5 -134q0 -61 -28 -118t-77 -91.5t-121 -42.5q-45 -5 -216 -6h-303v889zM378 700v-206h118q105 0 130 3q46 6 72.5 32.5t26.5 69.5q0 41 -22.5 67 +t-67.5 31q-27 3 -154 3h-103zM378 346v-236h167q97 0 123 5q40 7 65.5 35t25.5 75q0 40 -19.5 68t-56.5 40.5t-159 12.5h-146z" /> + <glyph glyph-name="liaotianduihuaimgoutong" unicode="" +d="M998 501q0 89 -55.5 165t-151.5 120t-209 44q-91 0 -173.5 -30t-142.5 -84q57 12 116 14q90 47 200 47q97 0 180 -37t131 -100.5t48 -138.5q0 -48 -21 -93q11 -43 11 -87q67 82 67 180v0zM442 399q-23 0 -39 -15t-16 -36.5t16 -36.5t39 -15t39.5 15t16.5 36.5t-16.5 36.5 +t-39.5 15zM243 399q-23 0 -39 -15t-16 -36.5t16 -36.5t39 -15t39.5 15t16.5 36.5t-16.5 36.5t-39.5 15zM641 399q-23 0 -39.5 -15t-16.5 -36.5t16.5 -36.5t39.5 -15t39.5 15t16.5 36.5t-16.5 36.5t-39.5 15zM442 678q-113 0 -209 -44t-151.5 -120t-55.5 -165q0 -65 29 -122 +t77.5 -97t106.5 -66.5t119 -35.5l61 -79q8 -11 23 -11t24 11l60 79q62 10 120 36t106 66t77.5 97.5t29.5 121.5q0 89 -56 165t-152 120t-209 44zM715 174q-82 -71 -197 -90q-23 -3 -37 -21l-39 -50l-38 50q-14 18 -37 21q-115 19 -197 90q-87 75 -87 175q0 108 100 188 +q107 84 259 84q153 0 259 -84q101 -80 101 -188q0 -100 -87 -175z" /> + <glyph glyph-name="shipin1" unicode="" +d="M953 599v0v0zM101 661v0v0zM101 720v0v0zM661 697q15 0 26 -2q18 -4 34 -17q23 -17 32 -52q4 -13 3 -42q-1 -8 -1 -12v-37l102 70l25 18h2v1q12 9 21 11q5 1 10 1q15 0 28 -9q19 -14 19 -51v-3v-410q0 -38 -20 -52q-11 -8 -27 -8q-8 0 -15 2.5t-16 10.5l-2 1l-25 18 +l-102 70v-38q0 -3 1 -12q0 -29 -3 -43q-9 -34 -31 -51q-17 -13 -34 -17q-10 -2 -25 -2h-13h-10h-473h-6h-6q-32 0 -47 7q-44 18 -53 73l-1 3v2v57v0v371v7v7q-1 55 9 77q16 33 49 46q6 2 15 3h3l4 2h501h12h6.5h7.5zM304 224l256 128v34l-256 127v-289zM661 738h-16h-10 +h-501h-7l-7 -3q-12 -1 -23 -5q-49 -18 -71 -67q-14 -30 -13 -94v-14v-371v0v0v-1v-56v-3v-3l1 -4v-2q7 -36 26 -62q20 -29 52 -42q23 -10 63 -10h6h6h473h9h14q19 0 34 3q25 6 49 25q34 25 46 72q3 11 4 26l37 -26l25 -17v-0.5v-0.5q15 -11 27 -15q14 -6 30 -6q28 0 51 16 +q25 18 33 48q4 14 4 37v410v3v0q0 23 -4 36q-8 30 -32 48q-23 17 -52 17q-10 0 -20 -2q-18 -5 -36 -18v0v-1l-25 -17h-1v0l-37 -26q-1 12 -4 23q-12 49 -46 75q-24 18 -50 24q-15 3 -35 3v0zM345 290v157l157 -78l-157 -79v0zM347 429v-121v121z" /> + <glyph glyph-name="yinpin" unicode="" +d="M356 2v0v283h-103v-283h103zM665 285h103v-283h-103v283zM64 302q0 -6 -0.5 -33.5t-0.5 -43t1.5 -37.5t4.5 -34h66q-3 10 -4.5 24t-2.5 33t-1 31v34v26q0 108 51.5 200t140 145t193.5 53t193.5 -53t140 -145t51.5 -200q0 -121 -8 -148h66q3 12 4.5 34t1.5 37.5t-0.5 43 +t-0.5 33.5q0 94 -35.5 180t-95.5 148t-143 99t-174 37t-174 -37t-143 -99t-95.5 -148t-35.5 -180z" /> + <glyph glyph-name="wenjianjiafan" unicode="" +d="M958 240l-124 464q-4 14 -15.5 23t-25.5 9h-679q-3 0 -5 -1v1q-19 0 -32 -13.5t-13 -31.5v-613q0 -19 13 -32t32 -13h172q19 0 32 13l55 56q3 2 6 2h411q19 0 32 13t13 32v38h87q21 0 34 16.5t7 36.5zM101 78v498l96 -358q4 -14 15.5 -22.5t25.5 -8.5h555v-38q0 -8 -8 -8 +h-411q-19 0 -32 -13l-55 -56q-2 -2 -6 -2h-172q-8 0 -8 8zM921.5 226q-1.5 -2 -4.5 -2h-679q-4 0 -5 4l-124 463q-1 3 0.5 5.5t4.5 2.5h679q4 0 5 -5l124 -463q1 -3 -0.5 -5z" /> + <glyph glyph-name="shouji" unicode="" +d="M732 896h-440q-72 0 -124 -51.5t-52 -124.5v-672q0 -73 52 -124.5t124 -51.5h439q73 0 124.5 51.5t51.5 124.5v672q1 73 -51 124.5t-124 51.5zM292 853h439q53 0 91.5 -36t41.5 -89h-704q3 53 41.5 89t90.5 36zM865 49q0 -55 -39 -94.5t-94 -39.5h-440q-55 0 -94 39.5 +t-39 94.5v45h706v-45v0zM865 137h-706v549h706v-549v0zM512 -55q21 0 36.5 15.5t15.5 36.5t-15.5 36t-36.5 15t-36.5 -15t-15.5 -36t15.5 -36.5t36.5 -15.5z" /> + <glyph glyph-name="tianjia2" unicode="" +d="M567 58q0 -23 -16 -39t-39 -16v0q-23 0 -39 16t-16 39v610q0 22 16 38.5t39 16.5v0q23 0 39 -16.5t16 -38.5v-610zM817 418q23 0 39 -16.5t16 -38.5v0q0 -23 -16 -39t-39 -16h-610q-23 0 -39 16t-16 39v0q0 22 16 38.5t39 16.5h610zM817 418z" /> + <glyph glyph-name="biaoqing" unicode="" horiz-adv-x="1025" +d="M512 -128q-103 0 -196.5 38.5t-166 111t-111 166t-38.5 196.5t38.5 196.5t111.5 166t166.5 111t196 38.5t196 -38.5t165.5 -111.5q99 -98 133.5 -230t-0.5 -264t-133 -230q-72 -73 -165.5 -111.5t-196.5 -38.5v0v0v0v0v0zM512 829q-89 0 -170.5 -33.5t-144.5 -96.5 +t-96.5 -144.5t-33.5 -170.5t33.5 -170.5t96.5 -144.5t144.5 -96.5t170.5 -33.5t170.5 33.5t144.5 96.5q85 85 115.5 200t0 229.5t-115.5 200.5q-63 63 -144.5 96.5t-170.5 33.5v0v0v0v0v0zM330 244q3 -4 7.5 -10.5t21.5 -23t36.5 -29t51 -23t65.5 -10.5t67.5 10t56.5 24 +t41.5 28t27.5 24l9 10h5t10.5 -2.5t13.5 -7t11 -14.5t5 -24q-3 -4 -9.5 -11.5t-29 -27t-48.5 -34t-69.5 -27t-90.5 -12.5t-87.5 12t-64.5 28t-41 32.5t-24 28.5l-6 11q-1 2 -0.5 5.5t2.5 11.5t6 14.5t12.5 11.5t20.5 5v0v0v0v0zM363 549q-26 0 -44 -18.5t-18 -44.5t18 -44.5 +t44 -18.5t44.5 18.5t18.5 44.5t-18.5 44.5t-44.5 18.5v0v0v0v0v0zM685 549q-26 0 -44.5 -18.5t-18.5 -44.5t18.5 -44.5t44 -18.5t44 18.5t18.5 44.5t-18.5 44.5t-43.5 18.5v0v0v0v0v0zM685 549z" /> + <glyph glyph-name="html" unicode="" +d="M194 416h-101v102h-46v-268h46v120h101v-120h46v268h-46v-102v0zM277 481h74v-231h46v231h74v37h-194v-37zM628 336l-47 182h-74v-268h46v212l46 -212h56l47 214l-1 -214h46v268h-74zM848 287v231h-46v-268h175v37h-129z" /> + <glyph glyph-name="biaodan" unicode="" +d="M314 437h396v-30h-396v30zM314 316h396v-30h-396v30zM314 195h264v-31h-264v31zM609 740q-6 32 -33.5 54t-63.5 22t-63.5 -22t-33.5 -54h-298v-788h790v788h-298zM446 670v18v37q0 25 19.5 42.5t46.5 17.5t46.5 -17.5t19.5 -42.5v-37v-18l17 -8q49 -26 71 -73h-308 +q22 47 71 73zM874 -17h-724v727h263v-22q-39 -20 -65 -54t-34 -76h396q-8 42 -34 76t-65 54v22h263v-727z" /> + <glyph glyph-name="25" unicode="" +d="M310 524h-186q-13 0 -22 -9.5t-9 -21.5v-187q0 -12 9 -21.5t22 -9.5h186q13 0 22 9.5t9 21.5v187q0 12 -9 21.5t-22 9.5zM295 306h-155q-13 0 -14.5 1.5t-1.5 14.5v155q0 13 1.5 14.5t14.5 1.5h155q13 0 14 -1.5t1 -14.5v-155q0 -13 -1 -14.5t-14 -1.5zM419 353h481v31 +h-481v-31zM419 229h481v31h-481v-31zM419 89h481v31h-481v-31zM419 493h481v31h-481v-31zM993 725h-16v124q0 13 -9 22t-22 9h-170q-13 0 -22 -9t-9 -22v-124h-140v124q0 13 -9 22t-22 9h-171q-12 0 -21.5 -9t-9.5 -22v-124h-124v124q0 13 -9 22t-22 9h-186q-13 0 -22 -9 +t-9 -22v-946q0 -13 9 -22t22 -9h962q13 0 22 9t9 22v791q0 13 -9 22t-22 9zM993 -66q0 -13 -9 -22t-22 -9h-900q-13 0 -22 9t-9 22v884q0 13 9 22t22 9h124q13 0 22 -9t9 -22v-124h745q13 0 22 -9t9 -22v-729z" /> + <glyph glyph-name="emwdaima" unicode="" horiz-adv-x="1025" +d="M270 626q-9 9 -22 9t-22 -9l-217 -217q-9 -9 -9 -22t9 -22l217 -217q9 -9 22 -9t22 9t9 22t-9 22l-195 195l195 195q9 10 9 22.5t-9 21.5zM1015 409l-217 217q-9 9 -22 9t-22 -9t-9 -22t9 -22l195 -195l-195 -195q-9 -9 -9 -22t9 -22t22 -9t22 9l217 217q9 9 9 22t-9 22z +M624 696v0q-12 4 -23.5 -1.5t-16.5 -17.5l-202 -558q-5 -12 0.5 -24t18.5 -16v0q12 -4 23.5 1.5t16.5 17.5l202 558q4 12 -1.5 24t-17.5 16z" /> + <glyph glyph-name="zitixiahuaxian" unicode="" +d="M0 -49h945v-79h-945v79zM0 896h407v-62l-88 -6l-20 -18v-444q0 -127 54 -181.5t177 -54.5q114 0 165 58t51 190v427l-22 22l-91 7v62h322v-62l-86 -7l-20 -22v-440q0 -177 -88.5 -256t-285.5 -79q-103 0 -181 26.5t-122 77.5q-34 39 -48.5 90t-14.5 147v439l-20 18l-89 6 +v62z" /> + <glyph glyph-name="sanjiao1" unicode="" +d="M773 89zM890 575h-731l365 -365z" /> + <glyph glyph-name="tupian-copy-copy" unicode="" +d="M765 615q5 0 11.5 -0.5t24.5 -5.5t31.5 -14.5t24.5 -30.5t11 -50q1 -2 1 -5.5t-1.5 -13.5t-4.5 -19.5t-10 -21t-17.5 -20t-29 -14.5t-41.5 -6q-4 -1 -10.5 -0.5t-24 6t-30.5 15t-24 30.5t-10 49q0 4 0.5 10t5.5 22.5t14.5 29.5t30 25t48.5 14zM968 771q3 -1 6.5 -1.5 +t13 -3.5t16.5 -8t13 -15.5t6 -23.5v-713q-1 -2 -1.5 -5.5t-3.5 -12.5t-8.5 -16t-16 -12.5t-25.5 -5.5v817zM1 6q1 -2 1 -6t3.5 -12.5t8.5 -15.5t15.5 -12.5t24.5 -5.5h914v150h-99l-203 207l-153 -154l-209 257l-205 -308l-45 -1l-2 613h-51v-712v0zM968 771h-914 +q-3 0 -6.5 -0.5t-12.5 -3t-15.5 -7.5t-12.5 -16t-6 -25h967v52z" /> + <glyph glyph-name="loading1" unicode="" +d="M441 756.5q0 -29.5 21 -50t50 -20.5t50 20.5t21 50t-21 50t-50 20.5t-50 -20.5t-21 -50zM167 640q0 -28 20.5 -48.5t48.5 -20.5t48.5 20.5t20.5 48.5t-20.5 48.5t-48.5 20.5t-48.5 -20.5t-20.5 -48.5zM63 382v0q0 -26 18.5 -44t44 -18t44 18t18.5 44v0q0 26 -18.5 44.5 +t-44 18.5t-44 -18.5t-18.5 -44.5zM174 100.5q0 -22.5 15.5 -38.5t38 -16t38.5 16t16 38.5t-16 38.5t-38.5 16t-38 -16t-15.5 -38.5zM467 -17v0q0 -19 14 -33t33.5 -14t33 14t13.5 33v0v0q0 20 -13.5 33.5t-33 13.5t-33.5 -13.5t-14 -33.5v0zM771 91v0q0 -14 10 -23.5 +t24 -9.5t24 9.5t10 23.5v0v0q0 14 -10 24t-24 10t-24 -10t-10 -24v0zM912 383q0 -10 7 -17t16.5 -7t17 7t7.5 17v0q0 10 -7.5 17t-17 7t-16.5 -7t-7 -17v0zM840 635v0q0 -7 5 -12t12 -5t12 5t5 12v0v0q0 7 -5 12t-12 5t-12 -5t-5 -12v0z" /> + <glyph glyph-name="xieti" unicode="" +d="M898 834v-64h-129l-321 -772h128v-64h-450v64h129l321 772h-128v64h450z" /> + <glyph glyph-name="yuyin" unicode="" +d="M463 644v0q-7 7 -16.5 7t-16.5 -7t-7 -17t7 -17q93 -93 93 -226t-93 -226q-7 -7 -7 -17t7 -17t16.5 -7t16.5 7q53 53 81 122q27 66 27 138t-27 138q-28 69 -81 122zM782 619v0q-47 117 -137 206q-7 7 -17 7t-17 -7t-7 -16.5t7 -16.5q83 -83 127 -191q42 -104 42 -217 +t-42 -217q-44 -107 -127 -191q-7 -7 -7 -16.5t7 -16.5t17 -7t17 7q90 89 137 206q46 113 46 235t-46 235zM299 427.5q-18 18.5 -43 18.5t-43.5 -18t-18.5 -43.5t18 -43.5t43.5 -18t43.5 18t18 43t-18 43.5z" /> + </font> +</defs></svg> diff --git a/Public/layui/font/iconfont.ttf b/Public/layui/font/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7410faa92d9bca5deecaeee33012af168c5e32aa GIT binary patch literal 52788 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 MkFROCK1>Mz4_$e*E&u=k literal 0 HcmV?d00001 diff --git a/Public/layui/font/iconfont.woff b/Public/layui/font/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..ccf64e6c420a9afb10342c142ffe36d56996e1c7 GIT binary patch literal 28712 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/0.gif b/Public/layui/images/face/0.gif new file mode 100644 index 0000000000000000000000000000000000000000..a63f0d523561c523476e5330a0d67eb7318cb187 GIT binary patch literal 2689 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 CBC!|% literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/1.gif b/Public/layui/images/face/1.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2b78b218996f70773540d0d3a8649d3c2d199a2 GIT binary patch literal 5514 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/10.gif b/Public/layui/images/face/10.gif new file mode 100644 index 0000000000000000000000000000000000000000..556c7e326801a0ea090bd693ca43807925d3cbc2 GIT binary patch literal 2797 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/11.gif b/Public/layui/images/face/11.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bfc58be8c70d512f4371b50b2b98c7b8adbe719 GIT binary patch literal 4121 zcmc(hX;hO}x5q=6GJpgKkOU|pVKRYCkVpanLLdZ?L8f9$fk+}mflvlT^!0%!fQc2u z&{}XnaX_S15l8fD6&%0`Wl*g3iU<{J6>zAi4DXX5wY{tN{cykBtgMx1IOpvD{{8np zCn2FCZ?41|W)1rlfK5M0ynn#7RlcCFkv4UM{8+Jc^fdNfTl(93N$GTh*|!~2Pq$1z z%9tKm_l;Eiq+9tq$6y2ndq4U1^d^s)(G9cj`v0hO9izi0H|o6!)0>?*xiy=1xz=sE zhc$K0uJ`ES&V670eChN)P=3c9F*DxOvN8OR8$LZD*pqbBOe?2(9j73e*jlshVvWtS zu88O5QPX|gvILs?bNnqi_ZVP2(zpA==#SGKqE7XOmqjkqcl@6oO@Gpc>W=k08Dcbj zFKlY;<Z-O=P%G|D@8WB9=nEByUb)>=_re}q{fSdeGtEA)c4i;<Vs^9LZZ)XtBz6yO zcXsZIdi<Scvcu%fp>JpE`OmK=9F7l}IwF35B6jk!<-~pU&{@&+8TR{ny$8p*BMk{3 zE~f8wL(Fs(KTWcF-)S}76+6~mKGvUq3BZ16(W?$5%rr;d%+H-ZO#iKc^1R)lx547Y zS-Tfqes3?CPY;CL`w4jZ=$G-^(w99w@5b9NH`LzT;V^R0{pWwNXJ=;}XVH<taj`-{ zbTEs?(AR^(V9=w)h-hMvBwqsk`uZ2<NYYly@`=l2>GEtoY3$5TB%)l(Cw<P2U_|5y zWf^jDQLZeuC^9asXk{8#O7iz3`WEsEvvRUz`4VDbR%Uh{uaHlYNEORuJm^~cm`)<< zhUBm0lLXoqL~Tr=B3DLa(>y)W7)&OS!=W*~*c=YioycM^S#$>U<#;f?cx(=jwTSrf zLxQ5^N|*Cuf<zx<L3eyoMt*({k4|5`dNpmeCry!?PG@qtT<sbxmIpM#BX3Q1zNFA2 zJC8iSLXa#kEmxkCFIQv}wJS=NDGKuWBuMF83RyW35q~b6ok!CpL`zd-(F-LxbS8~K z&&tx~r5l}>A0zuD;~z)o#jVMa(PLzJih|rU88n<cKN({8p95(JLTY$XxpK%9NoJ5D ztsqO5ogW&+CqZv$Qn{4p8N?0>TI9{~W(nEBOeRwh#1I8CglsmK<tbzc81rlV(_9t< zni3>h6zt{Y$z%pIy_w9wAZDN-P{3k~IBd@R+|ca2d`WhiY(B0Wiu-Xc=ReNn33FwV zd_``YLXkON0nr(Xd_`V{B8Mo9<q+K>Bx&+&?Sq9{gXZ!LlI6-*$)uuOMHW#<m?!@S z1zyY`PqvWj&1A3`97wu1izNv1_73KV1c3~Z2+DkJuJr#xjSh*SYs=#=<ud;WszL4L zpT!T|{MkOTY^Y~)q2|z=otd8c@c!N8+dtmCe)V!<eC);Z-=F>Vbo9xuBg2n}9t}SH z?+3r!|M}j)-8=n#y*;;Yb>F;k{o2*8&MTKMUF>MTaQ>%rXaDQW>9$iRPaHpXwDm~K z;X?<1{Gs_k)BeVNd-v>a*tN5M$M$Vo>uSH>^4+&J)m4?6%@v!z*{D`+C@(8jf+fYk z`hTrkTePNd^{RsWyxgyI6xmssD_6)f(wEDmY0D(3Dal_Yefh=G#LpAr<6>i$L`OwN zEDjF~6^Dp|gM@*C0DnKeuMdywy@<p1@?<d?bee}dm9o&y)y3I~OmZYTd}eQFOTgo7 ztgWz?7UmeU1*Rrw6cS-<WN4rdhqf5UcLs)77yxsJb{pszu!g~mXNv()Da`RTGV=A! z5h^!t78;p4p{%S>PH2Qtg$DFZqC`>5oCtN6QMM_*^}fPY2-7c#-=S8SnI;fj4k`;> z(6rso>@8Lt=jIfwOQBNFGzE!tw^)0*h}v&KvNO>GX?Z5BK1YjaCd#=l+QJd(l0yRm zO?Z7Isyh?uG_&mDz~ixN7)M}tLE@3Xc9e0STc$WCy$rD;306vOhn1sNAb0&3ePIxG zyqqfSlLrh(Rc$tPiMiiWtfySnx6FO?)-KgG2m4faSYVuf@gA%f=J<tO`uaOP*4uG+ z??u_VFIt~*FprGhMzP;KHQx0Ip$GpeX74CmxZz8Cmo+`7nQKcscIq4XZr|~9!{LW5 z%e${~i5c(`RuK|W7na&wdGs^iKKs|shqrX<4|kel&Uch{e!;`x236&DW?x)QT=R0c zq{&S-nvWTJWnSUk<m1+VB*09$kOA-e!z&g3qO(eJezFJD><`iRzE$gY7V-4Sz)>HR z!6!H1Fawx53<bGSPz(St6RZ;o1PEwT6PVh+)YOS!1)#pEfcb;4YV@}oov>T|c|etk ziRmr?y{UN{k5N@>l3@y%R&0jl@myFbFoY$`1VBV3A%vCy!(<5+v_)%xUNB0HB|Pj> z0|A3-doVt12n>rK3K?>F_N?T8DnUX@RzXT=lqhF52ymPs>(z6vs*0#JkgFi8T5Bla zT&*({sMdK2v@)4%TT|?*R14~YYQPq`no6opVo<7)(NqdxTz!@b6fjI}L8L7jYy|g$ z40J#MKv0kV`kOj4@j0+GQ~ft7a0m(-l2Qms5jq35ph~?lL1nd3qa&o!0aE!_L4Y=+ zzOU2rsYmYu2u|325TG3ppdSEq?TJPnV@H(^P~F!59nd!5AsD5?5}x&|1Af=UhiSs% zRdZrc+J1q<=EW34Vv;C886-xHP@y(zbdXd!MyfeR-xX1J>KN6}F{+<qR6ob)9K`6{ zM@IE?jOrmq^$?>n<NB_@AZi6$<`EGlG(cveW@+Z%MQO`MYgQuE#2`fpu*)d4a(722 z5(%;^G{_XCg@t=1$gJCjWbr_f1ArufO%Bv1fXAyuE}&X4_wPS;VvjO<JKzkSLsA&! zS4?e{SIY@k0CYfi@0EDv-w4bHOVS2&Rsx(d+mv!$tAj<<%}~P13Mk*w3SG7!k_5Oj zK_(K)w)tbW6@V=ORYXP7rf4c?3?8Sl3d*mWl>Kl$;5vXM^xnOm`7z*UpO9NX*|q-v z_^(kdRVWrQ-l{_+MXzh0nBA_jf#*$eW5&(&Sgw&c$H9gMV{%0F_3`sZQtRl8*A=_P zHaafi7h!%u&-J#ha`a$&FbkL^l*R{$TM|5q0(BJHIVvhi4W@9g8B5g0g{B#Hm4K7U zMgj^XpaB!?4jQFg1+ssn&?-}OZmQTPP9am&EXd9_Ccx~tgk-6aBnN6Y66n6&3-a2u zZeF?n;33GMv_-d30Ou!9hjoqCINk?LfM0#3>okkHmv3Dcf6ohRj=QjI`36J(MJ>bQ zH6x;S3UK<=*S-5R4s1*<ZUQbTM^<DL_k{)+>6fB0j7mZK{u&~Fr6}lBj$=m|LcH~! z`;p5brF+DOn~t{0I<`{9>q%{-$0axX4KfFod@Z|(u!_u_Iz>U096%KndyQfdx*g^t z4-~{hyVt289st$Tm7fks%K20!V9!W5Ope94rb=<icz&pfy?=<kr*y>%9G;9xPR5Y= z_91{lh$~)-!Jolk02^_Hfq{}wwlTM{0q|GN#e5Br8qo=Ko15Qt^X|#<7GLWTdnfb& zw5&&+SH)QwPk_$~y#+Qm1m0}k1SpJLEMmNC3I2lkNgNzz2#GU;#GQa@F2>W<)er;? z`L6sJwV^b51&$m6@~gE<l&;CKvD>!P)ojCyW9o1#zQr6M<8aAMTOuHJXYgn7XK*c$ zz6dhj=3LiV=~)}|i+nL8%;xSuN57cwAn5DAbNA6Lfj6+Yclg=;#g2f3n-~xL4s-~{ zz_m~Bz5(x6GOBtUtE|@xwmYA}ly({8)CP5v=bbuziv)+(sc_~371g>*CEue-BjM0F zNo}qBOS%F+rJ}7ntgi0HA<nu(9R##zx=>xIJJQu??TKCqhGw}&K>4kT;YUOmhN@#+ zaq;1Fu_0(k#^5jwSwQIF?6lChqgh#GT(b3PSMtvDlJ+=Pu^3}LV2#0xo1}NcGQ-31 zHh2tofD4&&05XXC>KXpYC|3&fzaal^1JgsbhBVq$BVHULwqY71rRZ5WYs%75tT7W1 zT~@fc!Gkp*I5^oc9915<z{gQyF=QsHA^0Fc+^~>jCz$El#I>-vxqSp)ZqgdEye^0k zbu|fvBvl86)Xv~vHdNFS1+{}M3)$vnyJ>Ys@PC4!{hRZ*=BxZ`^MUDcbb5HGnvfpe zkm{rMNmY2r<%V%!j0i4QSg#KUeCP`O1UcN#Gc?jO^&;HbTD0a6Tw<z!$&bF+C+!aW zhN!{X&ocFr=YZS#5%_vPE_ZOq&rjqR?i&B<H9Y*q`oZywsx>8no2t@ZB~N1VNLTzB zgVsip$@cbdEa7<T;_<OfRd#fgYTd*FsauuQZcEeS4JHOG>DFBV=F(r0wfIilgns+? z=Cxi*ggwEa@g_q}yy-4J*62e{<&`WY8<lDHC7=oSzTR77?Hc#y2DMNYvLO=06(8g! mTzBwEC)`Hu9uF~y$F58)g%NFfG=`4by^%)-m+TLK`TQFqMCJ_u literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/12.gif b/Public/layui/images/face/12.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c321c7eb0e5b5bdbdd10b93907b8eaeb3bf11bf GIT binary patch literal 3361 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 WgP>sQR~M_Jj_kRz-3$B!5BM)%<nes~ literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/13.gif b/Public/layui/images/face/13.gif new file mode 100644 index 0000000000000000000000000000000000000000..300bbc2a0384e5654525e7581017364dd9ceb59c GIT binary patch literal 7425 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 OGEy&?+)P4%uzv$F^0?su literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/14.gif b/Public/layui/images/face/14.gif new file mode 100644 index 0000000000000000000000000000000000000000..43b6d0a43857dc0990728155ed120c8eb66a5b81 GIT binary patch literal 2375 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/15.gif b/Public/layui/images/face/15.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9f25fa1d25412e2e929347c0db0878b0b641d58 GIT binary patch literal 1793 zcmZ?wbhEHb6k`x$cvjC)UFLjcxo+2{sU44AEqro)?t{~@-b%N3XFR-Hwxr+u<qnBs z7mFwQvj4qo(t79W<Y%v@zx;S&s$|0MQ|Eqt`g_GHWZCXNXO(ug@|2!9_V<iz*4i~O zn~!?V+Hrh_#-9tiC*K_Fy!-g?HOEKS;xdk(OIo${>lK%oH+No|8@joUb;8o>khO;% z-pt54c=5$f_l$zz1xIF9ZC!k8rPSX?m75>!3YoF0@6_@yw?fNicKtc8QFZZ3q7CQQ zJ28K6dKNF8dwdf2>Dz5FoA&JK_I!S*#c%QM(+{R^st_tYd#Py0=A#ot|K1Au_q1vD z6!%ScSEOWk{yZ-7e1G7dQxZR(%&R%HD{|8GPuFK(p3ArTeE-+$eg#|BB~~S$dA0ra zCi@?c7ri|<sbKHk^K<3?-tbwT%Kh%*lm!Wr^P;#ny}4I=@5#m+b3b3Q`g_B@{^E(r z=Qi5UJh7`s>%pb4sD-Qd^>BZ@TkN^$;DL)19`Dfod@V3w#!8pDhc<M}-nrBJ_g?0N zBTK#==Kpox^!ri4|Ns9h{^#~{4GDI33~)8lGhk+9U|>-E$->ITP|u(PWCJ5fjDdmu ze?xs!vs8YWOpZ)hzDjdnpQuc^mXOXgX{{oe-u@<M=P7ZP3QH{AgtTOw=Za2Iw)JHe z5a4I_wN;j0+ovL`$HrzA#J_n<&;hncX`yBlX=O`^H0C3lnVHih+>~|ZFy%{R@dafm z@IQa9kQKz2C85GpugPS}VD;TfljXPO4=V=Kgd@?P4xMV}<WQe7^WX-bL!9z!_C$PA zKRAcg-sqpgp^eIdz4l^fJU_7WGnp%et#LT8Db;(b(w!#<KePMEny7lkY)njU_n&XG z{)vk)`?>iXHU$+K4vH=vCN_(f6?!dfWS6n2`SY^jFjF5#yp%}dht@+k^lQ5mUcOp* zcs?^%!Geg4gAHe92$#NpR-1INsfoGiRz$%hw=<l2Mm);zij=rm*XOb322MEW$)PHz z({ON2<jDtYTuc^DjyF4nHC6;K{>FUkg|bMf)@r}A%N=>H&t=-OGD)%dJ&%aS1;<ZI zFE3`0)msoz_pmAB@rA|KTrA*7&;UgOGXo<7KLZCa5(0sdP#+xJ+}hk(?`z(aX71Z5 z8tH3QufX4=pl9V9StcYE;l|v>>?S28-4y56)#MguSwF{Wn{Bi0wrzT;!uy3&oA(_^ zP4_wBW87?f(kHzUYzsfa7D1pbvq83K2{lV=HFwoZ*)}QIN_Dj=yXlz=G?~}CDNBnw z0PXZuXlB-166sJM;cnU891&3uiN0ojaP%=)9kJ4E);wy(ATN9lXld$sVfl^MZ`{0f z`<5JUy@-h7<A=Pwa!rEqa^gJkysq!$Tm_q=c@k3`fBgE9tSk9%%8R0=ZXrchez7G6 zD_VqP>JMl*sta~4a6oo18!%LOf$q&}sITYaYiet1X;M?G&Sqt4V`0s%?q;x>VWruo zITPfDMZ!^SQHzD;+gGnyyKeo4jrC#{^>Vzt^*iM1EyS8U1jSr=;w_HEA1-Lp<w;3a zKX>7hf0JU8dSF%T&D%E<+7ylUKYC)M*n|{ZEMUu7fY$3aNE)ViSQzrOwtGm1);sbf z_Dz^%r|aYuqCS15lTnC&w5K1hmuJ8d&l*pEtR`qRKwZ!p-%_Ak4|D*~1b>MAGiJ?5 Y2vsx^3s|^#p`syH?V}DDY9U|^06Jl%MgRZ+ literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/16.gif b/Public/layui/images/face/16.gif new file mode 100644 index 0000000000000000000000000000000000000000..34f28e4cde0cd13acdbbd7482282eb306f5b21e5 GIT binary patch literal 6721 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 Oc~|k;OhAi#I{%-Nk>dOS literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/17.gif b/Public/layui/images/face/17.gif new file mode 100644 index 0000000000000000000000000000000000000000..39cd03538a5bc595fbc46c97cf2b06c8bd8dadd1 GIT binary patch literal 4439 zcmcgucUY6x9{#dOAOXTCVJRO$rjSJ#2?PQO$dn;gsE7oJY!XAPKx-0`00CJlB4{nM zl{zYvdT;AMhEUvS9atCOuG*qvMK9xi2}7Sg_WpVE<azRaC+Gam`#bONea~-2aG)oH zX9Ac252e8Lb^ocemV9UU@V@w|^VZY9g+04^Wctq9dtJieHtOt~{;|##v#*Xm`dRzb z4$D^$&P-qNy7%KJvu}T$ejuG5%Q&;gZt4<c`m)>1W5uJR^qc!JQy1-zmM=eAjGK5e zeC=DOnehWNe>7d%=`?b*_}!h{>07I&{`2nDIq$Re*qJBgL-i|qtI#ul?3uosH1o1^ z`subO#|;N$mZyuXrfw!qy?s43<b3m3T4x@;qrT*?i5GjK48Kb=-u@X_7KxcUL+F%f z%{<<6y2RnH%fZ{-btVUlC$2<2I~(@=gvIl|r7tcgpDVZdA_%;&-D|kbtX8z9M`H1& z-(YHN^Yo3NH@|&$V4LLO;MWsFthZybr#-~qPp$c@Pyg)J<@LdaO$BkUUp#$zG3RoF z-qWst*SA%QwXExVU8nD)KN={$`$OXR@AuADx_!MCcVzRDL8a}f2GPue(y8IdhdufG z#g<j8&8M%2{n~eAa?on#QSHkvqd%YAyK$It>wMpfOL1@dEFPUqnbmx(XR#{-Vpehd zA_Hh73IYZI05lXE9tm=JVjlGC?VBg$C1>)*U=lwyJ%>g7^Vmrun4ZESu5k;egbO+R zwDh0?5r0*|%9!MW%w$Fi(bos`&SU0f3$yuR9+;P%m6OZNV-a~Nf+Ri@dR7mUiJ)eR zIFm*6Q~v>~_v8pfe9(>L>XJ;MQbBij5|!@e?oM?EX%s4rOo6`cE>t?x&7Dc}0OvnM zXg5*H24*xjaDFf7jYUioi-k-wdGqGYq|L4*fhd(sWiS}(7&Mv-G{Yq~KS#{VbIHlI zS%|>p=O&BNh2nHU4ycaEOA>4nvxpGVxfHU6i(zweNt$#>$%1Th9#2T7k|^qw7AA&= z|L>{U*^9Gt#nJrtct09AHzr@mCr9&h1)D_4d}z9jdMhE5BjWSK0#S@WkhO4%k!b?4 zAU91Q1UakRL5FZ&a(a$>z)`azJe(PvlPl)sB=dv0EFu(xl%Af#q`Pt5xc-5z0d9db zDm8%W=Srvh1#kmsR96b!!{2jZEmx4dDVv`oURay*el7hU*Q$#lTL|sU<%`lk=cfdU z1lgb_X=eIIuuwcbJp$diG$<bR<5=d_ru;J&_1cf;L59GP)zp4K^}-NTKkCQD!i8QI zOP`+u)w>8PY}o9~G-M!eC*S<_dg9f~7vq2a@%-7--=92w^zgy`dt;*`ckkT3b@R6y z!`H7}z4GhjOG6hgoIiK=%;~{j2KrC+_4ah1>^gD$*wLSV`uD$%{Mh+JNBiOL4;?(P z|GTz*-+t5D(%jV8@b%uW_Ux{&+f}=>X2<qz)m4=h<y*^2RVBqmN`<^oCY5aY@{5A} zyv?6)66cCG3I#dYS(zE>X{j6dDalE^#Ptd5;@5r_7rW-u)iJB0qaq_#hKGfQ1P84M z4B&G7{n)-fEN?F+!_&jvjqXaLQphA1=jBe04)%7o%WR0&pw-ePmKNq_rUa8ujExKp z@cMeXIINB~2CaocBH)lcSieQ0i~%X&3^@g4;U)lpo|Q@E3jZKoib^-gUr|vJKv@Io z80xcF<W-dNO8G95qp35<0-afG(@%BxvI1J!&ZHV0k~7=I(f*(!*q)3wHnqkH*HRHl zY-6;keXznDOC$1{G2R8qt0R`3Lm8XP1FgKp>(b-MYvIquHrTsBY@pO2<T+f67?t%_ zoL2LrXCxr2#z^U>26x$L6`95$%bR$_fkMM*;75FkzgDGfOjvup^;luU4th$B1IAjX z%y;>qDP`mK^EH&zmGAOF`GX?u<%z|-u^#SDBr2r+yQJQ&Ww>ZCzMXB|hH%^xgJk5w zWi{l~;npVz_WmOCX!)nZ!op!C7GDek!oKc+QY;}OYdEr{*UEwd$AjJ1;dlB{-{|=y zaqwt37k*`gma;<YM42|`&PZb9*BF>89)vy8B48D6C0+PYPK(tF_!WcbfeIZA3_dvy z>-SeSR!U^rCt%%s%#UqJ`+2C9WACT!NxyNBk)wr{H0Xy!HuY8gxrF)CwUu2{4ea;S zzyKtm59mVFNYvEG4U2Kk3N{LDEXNfaLgy~E=a(Dr1aW&oa+DMsv2mkE9GmQJ>2b*N z3$G5Z3`;4yGvnus%qSh4PPdD3*U4_Q3jq(HY|+2CxLmN6qD)Q$(Q@0Hwy0=8>UQmn zJo@2X1=7NepacLsUioU`bp~_e>vznF!oNc@fFK>vK-v)Imztzd(=5k0t%HYpEt6Uy zR>DPb(zQ$B@PtsTG^7ch2C-|`ToVF$etU$JDv4?Kq@ro`J;_<FM16@JgHE$e(ULGE zS+-ak$#s3Aloz(tZnd^lkflYZBh2JmoK*Jm^$0(ef?$m^Qaa*ruF9F&S<ICiZ2U;0 zu9x_6UUc6`gRX1Wt&y?urk%9UV}Q0v;e|r1C2G^-5i(wlUt3e{>H|dsS`dB*nN*6D zyU91fkYz{<FD5er3A5s__lPI><U4Ko+$kC+&qpBid_PG3y;OqL$t#PBOH`$0Tgxjd ztE#tc-%+!(c2`|}DGX^rz!Ti6xIQ6FC%#D)jLYG~^9fan$nQDm=1Of#SK|)kHtkQA z`1<ZH(L|qv1_NLa*G3SuY|YW?v!vGYk^m)(BxSK#y45a9D0;m&JTyB(DuS;|SHR^A z8|l6@t#9R_OC$D46R7f-eV%sGmGESV(vH#7*1vo3^qI5gEC`UmcN3W&#&~2sM@|M{ z^-MXR;IlhF8gFq|{sDsb`Dv^`VZdT3OBE#=A7B}7BbRNJ>asL0KmwiFwF=z;&;{}U zogF0SR_TKNH5JjJQT|>GLyfk>YH&{SSCefzLau7Welv7wN5stpsxdX@s;6BCO$}OI z4R#C(y(2~I-9(79>FB-@MJ%r_j}m3;SLl(28)~G2wKYCY1$zPT!C4u2A}RZ)>damg z1`o6*b|(fpo5C>oHdvyb4C_gbRrMDF+ki}Qn**Y0ptz;uB^M)19mJDzfWaEGrx&Yi zU|;E3Z?u-Jv08md?iiIc0E7Enmh0}3Ax!HNbP!+RLjV2!I=@1VQ_d0ex8wP{Q$j{* zt#L|eZGifaSR|0eR$FByOE-X}IVi(<w>-4ymYUQ0&@Ef$Wi&MBmKrUQAuYX3z}}m4 z%NOvpu&Cj>>NnxRTM;M#Q#!tagEL1qM5;zh%DgS9dNtMX#v+C>E$yI1--copS`v1@ z(Yl4}kBN$$it`(gHCRf9Yho$ARTt63goL{Gqz$HaOT%J<BS&;C5cD+MAOQ5Du*PM~ z>dPxookl?Gmu7fn+|>hat;UDiN8vwc6I37@sFuSNW(3le;r6D$B477JB*<<&Ty$LJ z^6WNyQl;x>iNR|RUCXHGFW1J+J7wd+OHIv6RId_&1Vz@pC4s(`SIlTiY!P-pV$La> zA*XC&r4$$4K6WHN?Q+wOMx^D2bDr&fM{eQtW|&qrjs7K8BVOXX6DN+pg`}wwHtplr z7*xILd#qAkI$yxG5IYrBtPg8gO;1(hd>Pk~_Cq(>;eY1l8;nMM%P!7wqZXn1CL3qi zV8`aT8BbH+WFwniHMaH_!T}|BvSqZCO{O}WYJ}^Tl$xSLf?z|<mO5rDk>xKm<k*QO zo2*-qi{ylCw>2pr?|W6K+C{KCSZ7vTiZ)tpXq?wK0O*<{Xn;)E121aQYn_Pdc!mTV z*J~l;+>d1FI&zk0{Upp%i=jxPhJhlin|oGU)M%BiMivHy?%T&qUgqGxJXH+pAyvrO z7EXZn@dAPo=6Fv}qqhP4mYNC_Mvg*b*!TUF`jrw(ZFa$6x%q*4a+<0nvV7M*uyBqX zSS>`(Zsdh&cZH(s0@}81Xtd;w-jc*rtB9Eh@V({!|764PTDB;gG!aA%B%9Dh*}R09 z2^%zO=YA*~#7AV~X+SAHk2BDpsvGp<1ePlC&5e_t@^Y9jW2)V;BT?DVpwI0-PT`@> zQ^LIK+O{`#Texeb4VhNM043JM!E_V&O_k0Ddm!j74aB$}h|LV5e#YxVr5LG5Y#9Ke z5L&LJ__hunr$R@X)s11xWb3g7Mr%ioHH{ls$UX6(VfXW^=H(Vf;5;+zI5k(0Oy-%X zkXVkoreFv<giq1qqlmI1OyH7fVAU6cIPCHK%!LNy{-tBQ*N|)g-$mKTK9J2nb$|aq z*(AT0jpk06d@%ljY_z?-6OtlTeyF8-MsuDP0D0P17}I+tYI4Hvk8?PI+6&|q?z9b6 z-x!Y&1{88wte-2+NZ)S%GKcZv3Ya-vD+K^X<tQEQlAtFoNjJ2C=q?=Qhw}Yb&7)ON z_cyBU{)#{#s7KaQ{*ms_WFp6OK{jojyAF@_Bas3j#UVm@THSld^Mx{iOX5zBJpN^y zxw;8~kBR{+pT<}fd*V`+9dKqi3I=%OxDa-WWws8m68&7gc+Vvs3dG5CYS}>DpVjTS IdD(dV7kW}yvj6}9 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/18.gif b/Public/layui/images/face/18.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bce2997f86e477a6008fb1cae8dd03cda10abf6 GIT binary patch literal 3017 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 IDGd4k2Wv_t&Hw-a literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/19.gif b/Public/layui/images/face/19.gif new file mode 100644 index 0000000000000000000000000000000000000000..adac542fd33e152fc08baf165d1c5a467f0c2747 GIT binary patch literal 3040 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/2.gif b/Public/layui/images/face/2.gif new file mode 100644 index 0000000000000000000000000000000000000000..7edbb58a843cec27a1641a5c9b6d30b8fc1f8c26 GIT binary patch literal 3222 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/20.gif b/Public/layui/images/face/20.gif new file mode 100644 index 0000000000000000000000000000000000000000..50631a6e314179d0761b4ee664616ad2162ba147 GIT binary patch literal 5144 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 TKb&t*bx4GV=Q(`>7FhdV^sO<; literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/21.gif b/Public/layui/images/face/21.gif new file mode 100644 index 0000000000000000000000000000000000000000..b98421282467fb377dced2eabd72bcc5525f3e8e GIT binary patch literal 5191 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/22.gif b/Public/layui/images/face/22.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f0bd8b0023c25e74fac444bfecd6c5d7a0dc448 GIT binary patch literal 9823 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 TguQ<Wdza*$Ibr`PVUzv^im=IO literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/23.gif b/Public/layui/images/face/23.gif new file mode 100644 index 0000000000000000000000000000000000000000..e05e0f97a3674d02e0f160c5193f54f6b3a30fdc GIT binary patch literal 3792 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/24.gif b/Public/layui/images/face/24.gif new file mode 100644 index 0000000000000000000000000000000000000000..f35928a264bd981595dce02cf48c1776e2b5770a GIT binary patch literal 8096 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 Lls229f${$VzcBA< literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/25.gif b/Public/layui/images/face/25.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b4a88322946c1b65e9236657d6f42c71e412a94 GIT binary patch literal 3127 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/26.gif b/Public/layui/images/face/26.gif new file mode 100644 index 0000000000000000000000000000000000000000..45c4fb5563081d684f00cc3560df41b803cf7bbf GIT binary patch literal 3291 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 BI{yFw literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/27.gif b/Public/layui/images/face/27.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a4c0131dc926ee932804276038bf053a5cc1634 GIT binary patch literal 4377 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/28.gif b/Public/layui/images/face/28.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc5a0cfafa213e9861135c8ced7b87ebea74c269 GIT binary patch literal 2793 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 XZc$POJ{`i7|A8QtTcO)F=Mnr9*gf)y literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/29.gif b/Public/layui/images/face/29.gif new file mode 100644 index 0000000000000000000000000000000000000000..5dd7442b164b2ea32b5ae97da71073a31a699c83 GIT binary patch literal 4854 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 G^ZyND2?^l< literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/3.gif b/Public/layui/images/face/3.gif new file mode 100644 index 0000000000000000000000000000000000000000..86df67b7aad1ac80079562c74945d9c4ced3c397 GIT binary patch literal 4017 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 Z`!_Z%27Br#6>oByc-ZnwM>1&V{{f6`u%rM0 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/30.gif b/Public/layui/images/face/30.gif new file mode 100644 index 0000000000000000000000000000000000000000..b751f98abcf8173ae3c08402c99ae885a0dfe162 GIT binary patch literal 2555 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 R1!f{gn5zJ5I(^Xu{u7guhX4Qo literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/31.gif b/Public/layui/images/face/31.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9476d79608dacdc613410702804e5ce7483cb67 GIT binary patch literal 2002 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 PVIGYo?8G3j7+CoagE<gf literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/32.gif b/Public/layui/images/face/32.gif new file mode 100644 index 0000000000000000000000000000000000000000..9931b0636bc8f30b2172b608a44a90119b29ced6 GIT binary patch literal 3481 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 Z9mrT;vuyU1XYz&`-{`n=QBMP~{tv;H_#prQ literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/33.gif b/Public/layui/images/face/33.gif new file mode 100644 index 0000000000000000000000000000000000000000..59111a38c849fa06175a318fa98625c38d717398 GIT binary patch literal 2454 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 V#NY!QusNZ20Jq`2YFGsc{|mj~mhu1q literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/34.gif b/Public/layui/images/face/34.gif new file mode 100644 index 0000000000000000000000000000000000000000..a334548e8780d66ccd2de35bb2475db92c7e0489 GIT binary patch literal 3700 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/35.gif b/Public/layui/images/face/35.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9322643dae616390d8263e8cf1bc4d9fdfa03ec GIT binary patch literal 1800 zcmY+EeN<Cr9LJx%GTV09Xy8ymUIVr%D_(+hz-2>*;s8lPnTig9(j$s_FflJYkH{TT za!hS?Op8p-QyqNCgD=nyq|8VqAWBe7W=Lj=WoWv~dM-#W=l*m5`h7p&@Avn6Qq$(d z#V_{(K46dnO!sW2Cz0vTJ6SekbodZ+!@>-#`g)hY^Q3xY@JP>LZOIHSGgy9lTi7p- z6<r5aqeELq@9rIJUF>*2g1MUA+gN<3J-zRU$o*HRt3!Qyo7ny6+aC{39{v58t5f^S zS+91R<U#|yb!yVk=@`bj-aXRNvO~b!uBAzi>vFjJ!Kpn3kxW<g@ht+^#h|0LD_q|w zpExVdZ;fZJq%ptlymL->#~ya;<Yd>k(?`0}T$e&S-t!;oz2v;Gz4MdgyIpG!F91yM ze8;D&4irqgdA{ti!~4<sXCHKD?afoVA78uGr0+YH*19L|x2CDg_2tcVFVUIOj>Ai? z9gXWdv&q%&_hy3NdPAu5sPfQy-5*Wf!)@7j`*t%w7@BKmbQ~%Ed~?7b&V98DrI!!p zj1FxXzPk6vV~c*jIO|@=%In7zzqR^5JSXqk@5yw(IMV9*phL&}RQ&jxX%BlBk3O{T zGY7WsNNKCD9QtzVlOK$aFNP0a`{>DcG0oL8@AgoC_E)#;kh$INK)2YG@^ZGG%uIP< zrk2M600jQU7bpM)H25Ev<O6_*yMlr!{?(xAbkM8u=&iR>r$5gxO;eWg!`4l&eH#X) z`i05letvwp#Ufi1^ud0<$s*THRfg*15>r^==cuSKnk$rfXDfFvHCTjPSz!^HEFoJ7 z{iH9a7U+vElETT*C#FQfO)#$Ht3p-$75aHx1t->rDlXy7l`iqJ6dU4FP~}!#`D=Vf z<>2KiB`Dmh&adF`L>8qoJgH<32pdSM1NKmdp+*>6dO)^S47>tHZEIVSYZUKrZKAaU zHzzd(#2jeI&rcqdcy4M*s$B51xa!cdBO2+)ZK$%|qp)Du&aK=vC8}kcw5Fn}S`t-b zGTsPE5&CGh0U%0x<%=tlh}R2j!-rZt;%4@)sham_b-#VSN_2amUbNdDakbFi-Xrjy z7C}gMmZBQD^4)dj`|AZBgi2f6(0KpDtnJV3+iw4<qJCtGQro>zdF|74Q!Z=gIFteU zXKG_t#}yBS7)c%x*H{Y!Dx}=RS+*A!Xi5F{dsCuM^q87m`;-2yh6i}S6Nqs&g}551 zLVk#bd>zust<d6~jg}fDR)Lp3ALZ$b1dwENwI<+9NjA(n%B#FQ=J+XKMqCr*A~VPl znWM;bw1kW@2j}=M&&*u73@uyOo#_ijIgND8IaoO+{Q|ocJiy1&GAzA`l`cgpEG-|G zmSE{DLkKJVCfckgOfX83V4TNFE24s><#X$(xedX`8#Mqa&LW`6$pIYmvt@9JnFC^T zHckk4W^RNnvDQmDjRSQve|A#ZX#uOW&P7SXi=4iGDnGOJe>eh+LtvcL@g%AcO+_1! zA<PPeE4|SQFQI_udg&8Uk$y23n#lxX0_IsjnuDcMmgi{jiBqS~oNa3Us(DLu_}6vg zvpvVH{%^Jpv9rf4TH%C48vBzV33dosg958y?!jPSCKYv*f;5BU6SD)FlO|@59TyL9 zF}D}y{*2`|Ow3+dZN+DS-q06W6O7&}q{_mRace|0AMwN3;-D#mx0&W;SkuEd<Ratx z4e8jGI(&8{K@kgcXXi$lp<3L1f#?>i>Ev#;fD&|xlcB#x7#Nu!1@j{Vg&O||UrmXu z43)`B{Cy+f&>O~^p7}wfh{%n%If$C-SCm9A=fD7Ag(n=!q*U?w#MLH4zAPjwU~CVb zhQq-Iq}Tvt4d{>o@4;B$R>(TQcg;G$`!V4_Zj}?5U%@TO;N_t_UWS0Hfd81F)zs`r zTOxK~r^TJNqE4}zM9EMsq=ao$9}2<rXB3z|ga#q9E0C0h0ILQ(f=@K4a{SR6!(tyT z4*q}#uYwxy@@d`^xK-n8%g4AfyeF1_FGlz@dEwZ_cv~^}*u@ah)$l*rqs_bw6P-?N t$hBE;{B87qvPWtt{+<xSev~X0v)QYMl4&-1gwgBi@zDDv&+x&lzX7nWuUh~B literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/36.gif b/Public/layui/images/face/36.gif new file mode 100644 index 0000000000000000000000000000000000000000..6de432ae96ee120b440c2448e3977587f789a410 GIT binary patch literal 2331 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/37.gif b/Public/layui/images/face/37.gif new file mode 100644 index 0000000000000000000000000000000000000000..d05f2da45500eb37e7f723e9ddddcfd4e901d90e GIT binary patch literal 1513 zcmZwGe>~H990%~vm)XAatF^KD)yB-UZY^|TezlGHQHddWJSrx;^h4cxq@y0XFI&S> zE~nz;(St&iheOJb2jw@#6_rvdBT=G6WX`tRb&tFLx&PjOz8>$_^W_)d>&lKM0wNek z!1Bx8szKi|*;>`Rw8?tYXZ8D40sfjV?drL@3u)o17kLAvOl3A-H5#i?KCYLq6J}O@ z79UoBy4oFLt5T`vd)<_G`H#)<3teQ@tDU`K``c%OG%YPPN$9r(qRQT0UBqtB#Hgn) zj@39Vk0m`_&scisu{?OR{wS$?ok>Tw+4Eux)lkU%{Jd)Pu%;ruD|fYOGE0*po&ESe z^jz<oTE8dx21C~{J--=D)ay6MjAwUvEceisr%PXy1Wn!BqHgeia?16tx5acDdps_1 z<WB6vcT1|GT^ZLJ%O6ZkT;HkuJpHt-v^R~^SCw9S!r|5-%>1LkXBWLRuC5BY?db1o zrsk9hCHJOE0%qS1UK8nEk2kM4WL7OU?Yn68ERUsr`?I3jR5=hiIZ*q>lKkhb)tXC} zmY(lWH99MDR=svuGu=X-c@Q)6e(a;7r#anC9U1k!!n3C^_MNAD+wlCWk>Q1j$|nKr zkE4D4i5`=;fBp1jS*cv=>S}gPZqaBoHX4Ji{IF1OZZO}8<)8}z0Bn>fJ$--xruNpB zL<9h%Nk$}6!2vc3#bzH6NHa49C>kDPY>dG>#-h&rB4G<)M<Ept<EcWSt||LcfhQ<} z&tu>+P+lR8Gj%jK5}vzYTq`s(FOQSDL?qZ5+U<|HfZ6n*|B;Jiqqm*Yp8aSvsRkY% zc}+U75s5b9iNvodq+;r)IrO|B8gZfB-f2Bo7)i$Kq8H5~W+Z4ZB(8J#WGBO<898kL z)*Y9<2`uq476O0BT?s`ZaTdf$&2grq*n$+F^ehg?O3)VrutZMER$f6e1Ou0CAbN(! z$+m$2DtFCIeSOG}6H$k~VhBT)`FqP+Tlt10X1F+d)(603hYYoeb#RG1o4BPevC6u$ z^_0uO#W??%=s<|OA`!=_IvHfi4r=hoS}&DYu8jrlrY31%h2@Xc!F#z4dX%2kzUkJL z%>s-LJ&u#Leh*gfyYNYlVAc5e72^%z)!2SW2XBi@^^YiQ%P!Dc5nhM0(a}Y@;fSR( zqc8e(%-r1K{T24y_aELq(qK`4_k;b~k2X3W0KB%JvShD>l|I~rFw$}4xKzeV_u`4I z_JkclQ|u6_l~Wixm%$4~#3cxY^phRB_$q~Qj7%v)LPb1kbq#Wh%;WQJG>J%F2%pi0 zkUJ4u9!W%IgzRP^&i#)VQB6%2B!V*n%#m2<5dwdB7<T+H>^VEX@MTe{+_i+PUr7Am zS=nX3`A%e#dMcpxje<yPI@``(jBTOVZr>2R{MsISCdG2!puyMl|EueyEHy1%ek$X1 z#y?)PymDZwR*bIcH!?YxO+_W8F4BL+z!><(&05j{>EB>#DI_YM+TMxo7D#DPBoU?i z7)@8#Yv3u#0!Uf(C<a+!G-(7vCKPm*6zsJ>Ob9V&nFDjRGeMGH%Gr&>;rvWKn{gyE z?=%|CI=C5}bmel)8gYFhe*hq!q+G&lUWp^3&qFpsDPirlh`RI<Nrygb%Ox1J#Nbk# z0`qHxtsNP9j>PcBeQmMc76vUSPX!lr;JprxdAytTxo@a{s3so*F~L?k9&wF#d4;ke zV$$a3%Vsu`W*y!tIJXkw-_Nx(DUT@Al^x2(rMeCFb<uq=u>Wa}88upF>|;PK7u)bq zXgJ=Q89egCe>_@V`c`UCI^Wi-1N5{ua9SNllW9!t0;w<}|N2oT3o-IJ65;NCT#lUc z%W;MfC=5A*h&JVgiHpfm5S@OET*8Qx3%O*9h~Z6_)42?SbDo@wv=`*jnas{SCPeH* mFpdMyo)5iv`D$1(GLR%cp|IROieSITZd15fx(%cN_rCxoNOo-i literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/38.gif b/Public/layui/images/face/38.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b1c88a3e8658cde7b25b6e063d23d010f7ed86a GIT binary patch literal 3615 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 C2e#n= literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/39.gif b/Public/layui/images/face/39.gif new file mode 100644 index 0000000000000000000000000000000000000000..38b84a51394e20ac33ae5c9b6fdbc66f90f94a0d GIT binary patch literal 6495 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/4.gif b/Public/layui/images/face/4.gif new file mode 100644 index 0000000000000000000000000000000000000000..d52200c51ee924f0b91132e5cd3737fadcf40ef8 GIT binary patch literal 5689 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 HFfacd4ssj$ literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/40.gif b/Public/layui/images/face/40.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae429912d6d6f74dfffd19376ec1fdee426d8036 GIT binary patch literal 3154 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 F`w#2xZ2<rP literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/41.gif b/Public/layui/images/face/41.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9c715c5208044db4a057583efdf2bc12f099cd1 GIT binary patch literal 3644 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 E2fD;K%>V!Z literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/42.gif b/Public/layui/images/face/42.gif new file mode 100644 index 0000000000000000000000000000000000000000..0eb1434b4e81d4437098efe06cb4e1ab44a86211 GIT binary patch literal 5305 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	%FKWjtVdL1P%I)BVn;-eLqw9kid`E}a zG&J=<u1*zQa1a~ww$xZ27&c$x!!d520WO9PlSW^D{_U)k(e8L%p=Zu-4Pw_`eR-Jc zS-JD$!yf^5TT(iCidJ>CJ8N1{1|7tq>7^gBv#xYLH`r#C!^;h9XI;RqKbBhS%qb@8 z$Zi~3wVHyD6H(PvaxtC)i>vATG9@{IDuMyO67s3$QX0}El5ki=ds6~|oOfZORFLN> zQ58$F@}yECQe}18J~2r^ge1jo_%7?}Oxyrlo%Z13{mCK%2G8M$FrPjugsoaX;7#yi zmAd^)DF-$g6ar*b1b;@!Lj=X5kmR|b0Yw{&h;p7&$ap0nxP+a4Vn_uF1OU!&mQfko zL&Jp!kM%kpL;!sEmLro=lT+<suhN&RR@KsF>Kf%+S8eTVl*_oVD!@Bh{+MTXuW{@A zsvR7wt0KxX-vBH1o4f5<@PhDpWv7Bq_h2aiW4da3V3a`gex3OhKc%HkL0X=LMz=G5 z{c>N?TbxO_@Eu*JfLIR_?6-GeUk&+fUb^Ms4^A7jMhIj*?XMItELOq(8eN<wN|y<( zgp0{kO^zfJrqJ;^HxPo}WMHTS>!H#(6t0J=kSLYrc|yeuGMtqskP>auZg_FBc(-C0 zLJ5)*?dKDt&>v4DV=x@f0fLD9<w<K~XuR8gl}y<J6NPeaH%kYv#hS6Or<2)UF9n^5 zI=U>gHSRrwJu)?nS01a5!&!i=a(Y`gsI~i>xts4|6zFHhh@K(kb|USfv{}aWF-60> zGn<>9_vC%%R33>j%O;Pl*zfG9BBi;EmDf766p>il@>noz;h%3=|2awp$7yuM8nMoe zPJyi|X$a&ht4TTzm%^dVyF`8Il4|~G6lC)WCNma<nh(hrLcvy{PS}L{hflE0r(?GY zH8<&88BqXlp(J|~g&{ha&A#akW1U8Gd3pp<fSaz7wLGe8)Mn}F%>#4>9!EyF^y>CV zdzMGWY{)ktE?lUHbvhSSKbGG^%C{V8I&M6AHaObSG%T&CNfH#y%oa`_)+pZ7cot17 iq=<?Tob_dCeOLbYk6%%KMfufT205?p^3Nc#m;N1BJ9L)- literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/43.gif b/Public/layui/images/face/43.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac0b700850553a3d7be8d33cf6622c5a832cb1f0 GIT binary patch literal 2674 zcmaJ>XIK;I7M>I$fdHX5Lxv!V2q_p^Ado;3L=7TAMZpr1AP6Z!sJad$AczoPEvsuo zM8&qQ^;)kWAczG;#fH-MDi&50QRI@a6Rbb3cb<8k`Mxvfyyu+neZLbH&hzsZ+5k4d zGYHW2Z_{?hrlqdb4W86JTUA~duk8{xY_uEw`=IXq`FA%0w7037BMe7wxN18DO<Sgn zeQLXZkgj`KtQ)Euz0a8!HT!begwa;F6KgQKK9wMX@#4IB`(8V3d(io{#@g2vV{Z>V zKZ|{Q(D2$;<FVluZSRT<4tA(*X7xJno>SAby~^Z3jP^RAZNK~byHStNEq`{(R(sd~ z<L!`hCGMjw_S%QxbyeiiThlV+f{aA^>ua;BV{oILiP}f}kB=7V2CB4o=%X#Rqt^(B zCAi~>#=}>vbbV`n5m=9nJkbr;Y9EC4*E{uJbd<5NoyV<q#^c|%iL`fpKJ`F@4}>2Z z%}=FR_FoPBP;d6`UTlrZbEIWr#w^RB)}Z1XM%ymaS9PQhU8@H>q{FQ~qfbR6O%885 z_l$jLI=7v2^*3Hib$IuM6%S9i4c_9NtqjVJAk`Ikyn9si?&iX`y(j+=+YR*;jXc+= zVyS<(&TZZ9H25@q_(Am1&HmkIY@2Inqc=!nV`I)^#u40TK`1+t>qVxb5C8zcrWk%C z$Pp@q@Ha3xOCb~`OO#-|WO<T|NqTes5(!KaGf4})`Bc6lRFar9BPUfN$ccy+<s^&z z#iZaMFffaeB~?fzN+FmfO_8NBvX~^HSROB7z-zskLITHKl*vpITmJ*p=M0snN<eS& zbWahLMgx6($TYgQj}OfQ^rF(dC{+0M@ubli-aZU3U+~LAg0rQH6Btn(-j`hPj!8;X zDisV0B{MUVoH?B=PhC!-`TP6pF}%DyVGqx=Y?)G+<ta;Z`HH}iq={0K6v`yI4AdhE z<K^i}CJC<ea|=?%H&|I3dAuF6NG_#h2^AC?nW}H;t0SNP|6QfhZ{BIjD9QJF|0i%- zbhbi5iISwr(^Ewf*xf~+O2G(Cl?avc)M&Xp<?AU%Cd!rav_!cA3>El*ZhWCANv1bU z9gpDi8R4=trBEi4gmaiA7=xUYBxX?k{Cs&n94gnFN2AfWH1>2loz3NNy=c>^bl(ua zudy7tC|xR%DZj>wzsJ&k8mkwBQ~_t^NK%tBBw}8wTndgi%}DxbEuq|>;(dt~|Fo7+ z-cMsGa4{4;wLeh()dcHDzx*a#c=JvA5*e)bR9M)EF`ahwzayW9KYkc`KltwLz?;AO zU%z_!qVM^$|NPb4)7{ni^hw9#M-Ly|Z@+i<PTTEUtv7F6zt(cKx#>z{L;dBt+Drew zc;WoHvuFNw`qar2$B+Ga^p7Kl4;?&Evwz>->OEDvD|hYOv3=X`TetkSdDF%XzgCo& zX-Z4h7q2TSTw9Q@R^{bFYkpb1DknQDGb3FIPfdkfCQV6Rk(9VRK_V8#3zscjvN$ew z(ZZMo^XEkiqUJ`<iQvzkH8Xrh7>~;d4Pmo_gP4H<41YggA8-0}FB+9X_Vk$MKGki? zWY<Y9BxjK5M40I4U~gw@V{K(=VU9O5HNhDhVGSo>4A3YfJRY1sp|N5B0zBYJ0grGS z0GKeA3#rsoW;r_+InPQ#LZzi@71=Qg44;7y4<^PSGs`L<XEMsd9sp4wz>7jMD%E=o zF+2b@37>!hmLZkM)#Xs65fR~PA8d)=g1v~`F~6RKW;VBA@%Tv>(AENLp|vV@8b3B{ zAv!(m`3pDqF6$I)1{AR}*=*XhKzm|W4f{@6A;!Z&nW%WTe^H53Y=@m2JD0T<CwpyI zQyHelnUHiPk>+Y703arBj@i15m5XB<D$A)oWd<k~BeJg>WX(ijRx|q8yHR+gO-g%A z`Gydaou*Z$N9I~Jt1QCJ?w+ZmuZ?i^zU)5Lq5fs5LpU*RAgvpN2bbgqH1|hl)Rh`b ziKE%a*z1X><2sE_um4EdV5>?Po=VDBV=X5<>RJ3M%y7MNjsZ8<x!O?OG+9?{6SBt; zZ|6x8F1y^*xSf!g*u0Z3$=gu9o0@gtEuwY{Sev(W-Q~K_8n$_YVp-kx>=L`Frd|F{ z?w3(!cE?u@l>dJ2<C_YY6_^wQtDloHMO|9@osl5N5{>EyLU{IZ&O3H}Cj^bLFgl|C z#>XZs5M>}Rm~WtlDXDMNQ*ve*Qh*d9RgC$8ruAqdh_&2D%!XOgbHX2|$u(+tL{n)f zKwP_E6rsxkL&VMHQ!q25g?$59D-$wZaU1L@n;4rAf}z&lyq>=yhPnd3N7z6##^fq1 zZ}oP}Kw*$*MMWsjl;-Dg;qWom<N^n8f?N8nUXHE3TZ0uor}9c^6)nO2K;1m7f&Hr7 z_h-v_eQM)1<c`R<-RfdfML|GAQClx>qcOqhGbzCnXH#oY)zoqWUvlM8{a*!@_G^j_ zg{-Z0r47YnM#7csqm_o#n8=6hoTkn@A&FK9<Q}dIZgxz~fhboKdxtYC1q-`4H7>X% zhQKiBT(q)xL6u_Q){8-$sYg{<nYl|NBJhSIH>(Sw&NOq1TTYy#n*;vH3>vTk%;4*? zQGZ?X^U<ydd!xvLQgtDM=}OXQ+>1;JOCtgaOaunv5rJTUhz|4%^7Hche4<d`pT|!M ztf33mb{tM<=p5C&y81?F3KR!Pu&6ey3fq2Pm9pt^#}l`BA4pojV$lc%@ynrP6VC$s z;9!d<1zAu)vh5HQ!o>lF1CH+#nl!$2jBaiPTU9K}8^70|C4>eh0C)fg7s?$k)D?qZ z61?(Dph8n`f~YhfVal|kxo=eGKwgXE7H_ZKyKkSZuQ6-CI{<9kyC6Vya_^b|94;Va z??ekC(PCfT_z`%07Uu-`2=vG)xnG)!QssxaL7FnB@tz>pdB1MlT&9s&qEJ|@25Y(B zvU&$(gJBV@m>LA;6hfbyz(OCoROWr2W$ap8OQ1FQdN*BafNX7jZ{BOaui@e*PsTma Sh@V0@dM8BG^xew?0{#K$QUnA5 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/44.gif b/Public/layui/images/face/44.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad44497691d150ea5d02a900231e48ff519d9616 GIT binary patch literal 4126 zcmeHIcT|&C9}W;?Dq)Bqjt~$~Ru&;dkdXl>Xcz)2RYDR*fg~nDK~W)!0!0*1K`G0L zMJrf9Tcr^8UQwjrV2BJshFDhK<O>QN=Xm-@|NZ)&_ni0M`~KGR+~?k(qcaI>MbQLl zf@Z}a@qEX0^LFuEo%qvJ;JJ<X_wsj-IiE&<0s0xDshfZRU6~m*ShTL^Nl;gwwrJwU zr;eS2H36x<n&P4OvP)LEEK}ga-O_j^U?f)9qTg^vU)T;`9LxZ^$-pz*#~1NH)5ezD zBtc0!&`$^6hR=700&jfB8ePVpuAgq%D;kcOo1FzZo%@?gfZv>eZdcL5tCm>n&Nw{( zxbYZY@6l=HbgK49saoINEx-%g=E4ZkNQ$sQTRdG<dhG=8E>b*oU-bU`(9a5@$-?&y z`{u^0MPtdY3pGCVa5{O`19@nm*B=-NnHjwMvG3M=v(2aH?!ap*|C%fC%IDV$+wvnf zj*gD@+<*Zu2t}vB3o`;?v#x0Pq_E9&wjL!KPX`8130sZ&3lT|sR}0&WN9%Zi05d;w z|3i0{_#JP6?_O~QBkcATO=Q<3o0eWc053g-A0B+HLFS*p)WmA>GY<m&!J^Sif?M7| z7ipr@;vSDU`TBZ-oBTq<#v~7oiVL#!8CyjkzHhv$G+w!>GY{T%XH{X8ys%;2aL47k z+W|f0F;g8>;H8Inrev;0T{ILWY}^QpCB3gFS6|i{cx?LHgYBa6Own9<@;=qyD^+IN zY~}=xv)%hEQ}t@nx3*+%u1wKryJ^yyXIPaiH~eG`FcLpoty-R_{QADae1EiPDsT7+ z<fDLGoldRGjx3Eb=($2}N((3qlrM=y3(mWBU)fU|h3GhGF)=amC{%N*x4k~=NOhWj zM`lRVrGwSc=$_8jk<N;Vm-P>53cUrfqP~!s4)>v!W7B=t9>*KbzoG&|CnkRTt|NQR z#G9K>FPMy$qZ2)pMrz%L+AsAMU>8R&@w0;_o|so;dCxT%4VE97D%(E)I$)yh1n|mN z*lPBw*lw!ALG&i5F59lJ*lD31f9J6Bht}gw7Yt`R1LuZr&o!AXcKeBk&ds!aGb^9~ zy+LmtTL3Q)&OF=usm@qD*F4t<zr)-hY`0hx*Z?C}hl=%zW40xb<;7yLu2^X|(bEHO zPbMPG;4)Gm5J<A*<4T4SC|ru<Yi%3BqEJKVT&O=iFqmNjn|M+Ng9g)VVBQw4a90+d z9u(|!j7|4Aw%e0>EQD%BgW2wYT1Vg_!dPK+E(ID97Run@B5Yt38q=SSlZ=;^&0)~b zCfpDknElcZ=u%ERlTC+On4wIma0CL1!I&Y?78ne|1d4<skmhj7i!nu@aTXXH(h|D- zz$Dq&v;dqtfwY`UGP8jNak(s<x%ttfN6n6+%$V#zbA*+Z)lv*3(o|w$%86ufDG{a& zj^0WH0-Zx;2eY`rOa^o*BE_E>&b5I_D*XZ>jOFV3M_>lW>@y%UDl^PHg2FOKn8D4% z!j^D-w&rl%>3^2-RcnrCB#UnDPUkSg*;Km3TyMo$!reb7S~8SWgWJOnmTU?ol)$8h zhtU~aXMzn(^2dx8OvAxZSP6@kXt*U3j=>@jSb~EC-ho82fa8glSWCi6jIa5kQ3$j> z8c!lx5J?CG5n+!)qwR?VA`*duqb(h<E56PQ4wu59(pT~ZOY$!J693T`hiB6%TqfI- z$qZdl06B=sWpaX;EGXUs12uA`P=gsu3tN{q=nGx~ogI9HP9w3IVbISE<AT3ZffdFQ zL$W72pfJnGkw|+i+7f}nqa3jISbNyAFYVv3W-ckld`TXEk;}@GM1xDiKg2JY{BeBf z49S^cOAd#WSOf?c7v|??fB!V|ae8WU;=}mZ`_Yl%p?8CC2m1SZ-@JbHvZwpEt{0up zp9wnJ+ge+in;IMH>uPJNt12t_<z>H?K7I1b&yOFK6c_#Uu(064kN5B8|8O_&&h1+_ zZ(PsK$<E6BKI7We^t3CNFQuj=U%ZfXKJmMR__%XtW6zxC#YCSvc_QlgvB-#{N5Z)r z_F)#25f&QqZE#Rv0G&qlr}!N@_>J#@{rh~pz4m%~xVw?}>~?k8wbR+jkwhfm9qjFF zci32O$5~-5F&1bP5&<_iGc_^Zw$;ecV2i#UOc%O&)5Z-t>$SDkX|B~!S5t+ktXZwB zq^KY-w@MZ)BQ3dNbmzgciXbt_L~`3m+OQ@FBroa23LE5OE<(KS?NrbOQ*!X<$c()G zu?nj|E(-eLzqC*0+Ub(dg57lGom8NQ(hu_soZ}pI@0*zP!RnGh$EEwB_=i=Vpfnk6 z*)9q%K0!_vRNkh`KV$$ifP?+elNIUPQpfUwP&sv32+mD%j$gkl&r^Djr-FU;*=w6g zDSPt-w7n3uMi*|K{XkWj9)bN7TXI%m-PUF`U!-(=eacpIHVZf13ei$ATYpuH|F%{| zd7Beln{qu_N!m>r(0Nvy9r9uqsp#amN{f=oCMV?uxx6H>&hD0(^l4K;I)Q)ur9loz z8TvXn+K1KGU#)~a++VdAfK!n|=|HT@@4V$Tt&-iu_N%A9B5pFVvNr0ntC78XDyAY- z0Z)=TCT#_Fik3TA*G|;ZzNlJfyE>;=&KBE7ZnY5&>YdYKJkH&->Og3WgN(HOPec&l zG+7&e)hW7FN7dz`y*~6zU%lNGIHYC=C@5D}8Qz7eT4O?}sMJ%0Llf}lav=43Cu!xC zspM%^!z$&R{&wA#=t+5)?~(X8g8(cm#!-6h^+XvsFXy)0CQmg*BO1=L&d`EJ30%D{ zQEezIN>Kyy=cY=56hSH=8Of#^gVvf}KTG1BKV<+GEv5xG*}^?=TrK}x{0+1|q$d6} zJ-0U2%)zWlfPnthUm64fsY(1xmqg(-nO!XJq_|CZ2hS^W5oju!JPd5wuvNpzDb&5M zTgs6K4NpxU-zViL<LHF$AYE@vgUcCQ?{wU6zk{l;K@;dDRcyk86WR?ff;3}&X4-ys z5A(up=z3~B@7Swgxn+Hj>aN4mUgoN0{=GX>ZeB50<@@#_KDK83sOc3|m6?%Wov0># zBP>HVl&@HJ@|@IS0o^YF`G_`tteEFrsI|F#t#U0t+Eg3quibl**_R=|-NdI$H5SB= z{yQQSkdg$E*B3-@)&=+~ZqtCsX{T&al$DOoU4lk{tub1LMsV@U-JKfK2-_K~S$L~4 zO?IC4(5)>Vty5z#?1HM|*=4G~%q)Z_<?N1C?*)|P|DNg#d2?SOPn4XB2~^|5j@L9L zJH%9!adh*#$a)3Nu_1CB6nM|Zv!5Q`IDB7qnNHz%hO7p)7*e;%*uaAzw;00t1@*ij zH`upSeRz1nyKFF6Y!C!=QseCItB+y#8IqN^qx=pDPgi>7<8a;$%{$NGTh%#{J}k96 z1Q}ERiLUa|E&blgzRoGnrnkV-jjh4t9KrL71eL~gPI0;$tkPDxCqVu{0S`SwDc^BM zwJryL^}xd;r3<zBK8Y$i5y}KU@3hnbB&`ZruA9x^wNw=KQ2O{ukx+=K=R2rc+<T}s zMER>^2>;5v&=9%?slQ8vP%Nkf+k@a-r^&SVx-uo|4=xY&Sa!)a)OSv~c72B~Lp($C zRMYP{WE#k%0Uzfky4J_IUo!;{@QHfrdSFp`4iB7qQ@k*jf!mw&><3Y=(4)vmHQNOP zX1l&6?C(0I-f>&oKUb!^=tGN-mZM!_$!f(8|HJ$j#4Lr$Vc)wL<Be-V4`xB2lV>v2 zRu{$H!b;_*#T`Phwm7>trp5XFIGH{_<m#<tyn~$I^4y=K5Yt}L3@P!e=AA13_d@(n b9m~x}3bb<1{HG4&QaApSkpJJiWBdOAwI><< literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/45.gif b/Public/layui/images/face/45.gif new file mode 100644 index 0000000000000000000000000000000000000000..6837fcaf214a394d8efb68f5d48c9ec6f9ea1fa3 GIT binary patch literal 3417 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 AegFUf literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/46.gif b/Public/layui/images/face/46.gif new file mode 100644 index 0000000000000000000000000000000000000000..d62916d4031609830f26ef77c17ad26906ac9717 GIT binary patch literal 3007 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 Be_#Lr literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/47.gif b/Public/layui/images/face/47.gif new file mode 100644 index 0000000000000000000000000000000000000000..58a083611d7c1afd95d136e3a7fa798c86d0c2ef GIT binary patch literal 2333 zcmeH|YfMuI7>2)d+R_WymLAH@(krc}g@UaIXysZc6v|DCFw{lML_tx9cp184*`ZL1 z8relh&=?dGG3o?08na|UL^p_06A@IL<1U+y4ZKZ27)xB1?B{;%hyT9c&-c9VYf4Gd z>GQq88%FK$%pZF7=(9wa`2rr;b`38_u1Ni#YoJ?-PQ<{Q1Mt)dw;~qzlI6dI!E6&; zR4S&=!}MYJULot>=bAnPrxl7WG3{Y~-ZMS?R7Fmx;JV!ZrqlUU4ZS8>Z=`Gh;F>w* zWhsn$!lPWuh!*)(43jHi(gHKv;NC*y$D;Kw)<I8Hc&|C(vM=^>BTS}1Ph!lJ4eqYW z{g%g>PJ`Dq@YVr0ZM$bS!gWJbUl8S%5Sg+-e-LyD{YIE@A&eMd!^;HdTx;!1^10x_ zc$`oDtrVHP22a+a6LRQY#Ggupb_~Y&@Tv?ZN#u<IW|Clt2GjY_Cqt&9VQ4$;i4eMS zvpRe!Jx1C1r|@`N;q+=aD+p-E7!UOUT|O|#gwa^^RXF@ChhaD9R-&)Jf-_9!^J6f! z0G=O#VRslrp?~+5a}r_C=Hl@><R+oM;m7R6n4>m07ao2`LhsAe+>VK!o12r&xo0FU z&rUEbOVoxerXT<yc|)bKzz)Il_xzK*0qAoTcCyk@Rqd>CRc;d(gnBusp#@^!YJb!2 zEjv?U4%vf|HLNuvF}0Gq+TAmiuS;9EgNm>?9F_(VG~2`EI{r7h$iiJ^X3FI&h0z%4 zL6hltEXxP6ib9p1!Xj|?EmBaZ#MNqCo0Ah8sZwch=Bm7K5>qgR3O1d7XW6dOArs4w zeTi$Z#&Hh_i;mYzcq1Kd6%cVmEO9zGLXsFOmM(H|d63aejf+oa1m%s#@d~JB5|f|p zkhEvl9ORZ>`lH{%a6?t;-40NlJkhCOSOwY!SO8(U=fBerAgKw)j~WY_$x-8%lobMT zW7F7yst~s7Xu+w;z)Ft$W}2Y_4NP#ueD06(iH`OLp_|x4(cOjy1niZi9*xp*|H8+7 zhYy*DhrPq+6`BzeOuFpBOEN<JYwaN^JKa}`47C|4*=y2}P}h=`C7zy}%%U<f!@P+@ zA!vw)ohr)aq}q7|UW{RK9gok^<A`m?9=T<coj=b`Ym1iYDZEx(!T1Cdsm<Bh7Ika{ zQyWR>^>#J7Aurs3C{ZP@)Gp7QeZ;u1*0eVkjWV_tTGL5lLsZ%QmVr#~iiiTQ&bn%& zAUN6hdnd%DpD^<88eN#Qi{-iWM!ilP=s2j$lAgWD8yu=<+sn3hwix!OON`05T<SR4 zK$MjQ#+OR2RyWv(^B$<4WHKZhLc}gd#{dFh3C(X=Z4|O~k?GX>M$!!`a0qYQ+D0Gm zjNQ!D;g+hwM9lVZCZ`~Ozsn=@Xkban)%L+;Zpe$0I!N|e`gP{GrlKDW&>WlF*<wY; z2IJnV`CiTcv6_F!{(Woyr`G)U=uG}II<<QpUcRE$!47M=shsMx%C~sBBOzotjmJwX z4y*DPm87QfEX8|5X&gR>Kz-^fm&{KNpQTa;MH3VbMTSO)Iy`7<vqghPBq~(|A;X1n zg4+m_&14p>$cc!}$F;)1yn)K77`oAz1q<m#MReh%de;yozDdIdM_mHi=5l7${O~!p zF0C^D!>&dbPwMcqZS4-Gw#0WxD0%0Pa38b|9mayJf#kALK}E#J$BBuS_BN>|>~!Pl rL2H#EiEFFJCp(ZsP5Wj&2CVH=rzDGc@3T0Qspp*aTJ3^`42b*_XAT7W literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/48.gif b/Public/layui/images/face/48.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ffd1613b5fa36c3ffa7daca94e7e8cd6f8d82ef GIT binary patch literal 2689 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/49.gif b/Public/layui/images/face/49.gif new file mode 100644 index 0000000000000000000000000000000000000000..959b99296b323c0f9c6dc35e14c9f28cc66eec04 GIT binary patch literal 2315 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/5.gif b/Public/layui/images/face/5.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e8b09f15101f3e3fad0777ad068fb559ed483a9 GIT binary patch literal 4567 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/50.gif b/Public/layui/images/face/50.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e22e7ff12a215188dfc4d0314e91cee7526e739 GIT binary patch literal 5866 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/51.gif b/Public/layui/images/face/51.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad3f4d3a8158106dbfa48e521084e6c56fc6406f GIT binary patch literal 2785 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 Y?y9hKVE|Dl+bifDKf^#>4e-@}0Qq7Ywg3PC literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/52.gif b/Public/layui/images/face/52.gif new file mode 100644 index 0000000000000000000000000000000000000000..39f8a22846945358446ed010e2b9bd50dfcc7a25 GIT binary patch literal 777 zcmV+k1NQt!Nk%w1VHN-u0Oo%H_RysE&7t_xrK?&j)|+hq+_3!Ft?IFT)0AV!c0$aC zRqD8h_|TsJ>&E)ltKOw@>9vIN%AU!BNyvIc?7@=%;kM9?T>taZ_{^H%oM+RGRsZhF z`r5JEo^R2GQ{9+i_}Q%g<GaI#VgK^Y#d$^l;=J<0lJUlty>dgjaz^&bp0Z&w@W+~| zS1ZnjO~rUYx^+wGxrybje(A1!?Z1)y)1<?CO7_Q=|LMc^$(sM=z5Cp;$%9U@Vm1BS zv;5Ma`O=}vie0T;F#qJb_tUBO%9icFj=F6>|L4Q~-nP||Tg`+@%Y8|vQYP4yVcL>g zvt~NObU**!w6tnI+^U8B*sH*IM&_z|#eGZp)T8>;r>$c?$Bk&qfJV7zHKbH2=(mZ+ zgI36gS<Z`6*p^?`opJTUlIgsP>AsHn*{k%yj=+0P^2nRuqi?otLDrynz;{Fc`{2HH zLjBdIzja5VP9(HtHTc)8{no1Ese0nAeZ78I+ml?_ms$MWwEzGAA^8LW004ggEC2ui z02Tli000O7fPaF6gnvseg^7xP76J~4i-a$bjE<C%7DP!Bf+RpbOM_GjREY!u0DcO8 zFANo&f-eG5iacxp99W(uurDmLixUDl0VsMUtA9!k6ts&P7)2)tKD1Fp04Rz<Byc2M z1`GfpWl=Ij1aFCBF-RdCeHv9#IzJ~q5eSJANjo5EI~?dCa3RD69R|RNDO4uLofBxz z7&(yzNt_KAM&K~ArcjUw3#<sKBcx3X93w_-Xb=K|jY4)F*q9;+MvFXBa5QLuBg6tM zg|;+lLg-5eEft0+tw2LgArTK?33BrwfRqAQ3(Q$?q@y4&6o`bW35AA=8hC!xP+KEF zgcX8jraXwih6f4)01V_Xp~g&+A~$ZBSOE8r2ow+~+<6xO!i)otAsm=|;7Z{?DFz@w z;KWIW4}6|H$v~Pk86{o_?OAa|fd>yHm@r9@V1n%lQKHaE#3h9gAw5<MXhEF#03lEW H1p)v&5q^DF literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/53.gif b/Public/layui/images/face/53.gif new file mode 100644 index 0000000000000000000000000000000000000000..a181ee77882f8249f4551516085e1c2e7cf0cfec GIT binary patch literal 2127 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 S8f7`(nZXDyt@tenSosGvnoLjt literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/54.gif b/Public/layui/images/face/54.gif new file mode 100644 index 0000000000000000000000000000000000000000..e289d929b9552beb7be70329b7cbefb1d0618008 GIT binary patch literal 2196 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 DWiE05 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/55.gif b/Public/layui/images/face/55.gif new file mode 100644 index 0000000000000000000000000000000000000000..4351083ac8e0e65a64ff362cbd480f2c86eab4fb GIT binary patch literal 1971 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 T7x+6Ovp=luFOB}M(dYjI%uUQ| literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/56.gif b/Public/layui/images/face/56.gif new file mode 100644 index 0000000000000000000000000000000000000000..e0eff222ba83ddcd3c2212e9336fb143e72204bf GIT binary patch literal 2034 zcmZ?wbhEHb6k`x$cvjEw^U|Ufk-9H8H~)XU`*gL-vvrOC-=4ZRJLhPQ$=-a|1+F4z zTKpc*PQ5!h{&th=+l`gWg4K?cd7UV>`2XVATx*{HPqy9Z2|U*v^5N{_<Eh$vvy6V- z-FACQ>Y-xKOU*%7Iz#@yI(WLw{#sx1sk)%2iwiaf%N;0iKagdAzB~F*iPzCGpP#oj z?8~-3TITfs_x;@w3j33EU#_qHv8&-kMZo`;dw-vp{BnKc@0;sB9Gm&^<oy5dkN^LC z_4Ur~110wV-yFNqAM^j?$sf13zCSwkLY2eIwUsZob}jajezmRd_w_Zer}%A;*Zpy9 z#*d3DpDw95Twr&7Qp(L~SwHqqINch5pv>=RvCpS%4gdc<KAmrNe}2J(N#Sp1MQ%;h z`*~&Mu6XsAn>xQ8oB8eJ+*SUvKMr&}UtVyzC-&OZtmBp5_h%%ZD0ST#t@(9(-Pr=8 zALr+P+uM1n&f~}a&W)M&`_l||q+0*Gx8ujrNq_HcztiD=ti<|Yw8Di3um4XE9LaUs zlcDqX&gKI}R{#J1SNzZI=Nc01>=@u`q-Vg)$iTn=6pHW-P;f~sNd(e1_7w$*$=RtT z3Q4KynR&KK?|1K4QpilPRSGxtHSjHPPR+>ls47YguJQ{>uF6ifOi{A8Q?RM9s>m(K zO)W`OsL0L9E4HezRZ2|BPfE1{vO&W7N(x{lCE2!0jvxsIke$x?MX3s=dd9lR28M<T zW@dVZCZ=X)hB^vH28KrZ20&z{YiMF+YG!3*t^fr}K--E^(yW49+@N*=dA3R!B_#z` z`ugSN<$C4Ddih1^`i7R4mLM~XjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8& zOv*1Uu~h=P6yk;40$*Ra!Fk1cU=Qgf=jZBIBo^o!>KW+g=7RhMR$W{Yl!|Z$R@KEJ zl?AE#L8-<0rA5i9K;_CX&A_n3ZxKi#&^1>6MVY`zNz8G{PcF?(%`5SAu~h=f=%r+) zSeY1F8oC;|7#X-38JJlZ8d?|`IXYT6IvcvUI-9#1nZnG#rq|8H)XCMz(bd($)!5L` z)zHb()XmMz(#6!$#L&&a*#xH7Gq1QLF)uk4W^X3YUKb}9b7My*6QEv0oO-RCi&7Iy z@{2<9^K)P+ARr^ZB)>Q#zd*q`*i1pgH!(Rg4<w)oiXe!8T~doO%TiO^it=+6z#(jv ziNysbMudD0(VId}sObY8qYp|RNXZ2z1Wbb<COq*2Iq>Y0ng`4?MZnC#`2XMEKfizd z{PF$U*Ds$xef;qL-P<>>U%h<s{Mpkdj~_jJaR1)jJGXD$ym9^7)hm}TUA%Dq+}Sgy zPn|q*{MgYWhYuY*uz%m)J-c`9+_8Pz)-9ViZQQVa-P$#)SFK#JeA&_^ix(|iFn`|M zIkRWYoH2dc)G3oEO`Oo**W1(G)!EVB*4onC)Ywp8S6fqERasG9R$5YAR9KLomz$HF zm6?&AmYR~Bl$a177aJ2D6&Vp878(*96d2&|=j-F`<>}$>=IY|?<mg~;XKQ0^Wocn< zW@=(=WN4tTr>mo_rKzE=rmCW>q^KY-Co3Z@B`F~;CMqH<Bq+eo$IHXb#mT|W#>&FX z1T10{f3k3jFw`^X081NSH6X^o!2Y<QzNxvTwXMBbs>`#Zmqpvrf~B`z$jLg)f_q9E z-*i3cyg9A&q}e3O7q@uwu`<|jtZG?n!z8t-nS<4gsb)vhE?=|QP0nIsk?HLAv671` zMD0uzOqfNP{1m6?FgaM6yYTZH8fzBH_j2S|-B(uA)Ra}@$nMqmu(LBYGRik)(Bhbq z5z@rXAs;`l;74Ps3%lhxfvG1953tYRlXyCFhS0|g+>EtfbXG1>>zW}EvW;h>d)rAF z{h$RMI}9GPwAg%`BXctFfJ@VS&K{NrUltvmVaOw8@L+>`<0^5HML_`$iQbDHK>lV$ z^Y<f=zng8_qFOq;nz(`ale>FTJ&S~On5D+#Zn0^4(&Dqb=4!J^<Spuq;sttJcV%ap zs|}Ow#ui0aGp4#7%|L%k?Ev{Zg55qNe5Is`71ZCAvjrjkRss53*?w{c!##6ZEiFMo zH96<W24H{x0eV|*ijUV})|N(ne+!udMvIy`(<e=NBJqIPXAk!$AD_k@9BmC&!qY-B zg<Ji2v~+B4Xdg~#5Z4Ug>zJ{S=@5H$THgZ=0ez<~KE?+fO^r%yf<o*Q&NT>dw=pRP O9M<sousTbD!5RQX*CV9> literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/57.gif b/Public/layui/images/face/57.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bf130f0d930a1fb72ca83265bb504304cb08090 GIT binary patch literal 2705 zcmd_rYc$(=8o=?tHVAr&EryxV4b`qo$MkfjMYWnBM5zY7pcssCsY_gop*9h>q^2$n z;+mvEw{eNVL1;+QkRTYPTe3ZES{2fRy0p}&{$}>gp54`bwS715es7*PpYwd5pR<dT zwM~#7qz7#Ph~xW>vLRiZe&yHx3T~L~LMyp1+Ch+rl~pHhkJhhr+#F1G?TNzlgrAjW z1@wfUX$!P^NDfdoXNqrJ8cg%pl+eMG)^W=BL&VFHAJ4CFi=Ngb4rO>QwNVCAaN^|i z-BB*@B~_dKRhtsVrnq{sgR;i2k<lWyNA3(HyNu;rp1u_z=iDA9cnGe$_k`Jk8UA>V zudJTZm*~F4rHzm-f<-adm;|%k!&z6sf(T4EOGti_1gBpIYrrI1ND5JM$b%%G{$w{r z6Jcw#sT+Ucjfl}1d}^*C1I+SYcVzd)VV;+Uwnw_o*C#A=mi9#0ZSaa^Wq2^h1IvSx z<u@KvuYoc4K$5GhEOxOq7d-D?<Ydk@5a!vb{8aCW(nRo>BgqW|ll9B(S@)xz!7C{* z5;av4Gm+=>swGp|oWYN@-sms+Fxk)&U^SNI{Xt6qFn+H+$ZEcsyw+R5k8zk~CM%fN z7dUB(+7vJ^Yz?w`N)2fZJ=+;#177q$tBzK%5|+8Qdcy3$+Q`;uEf`~NiL1a=hpZ%W zy6C${RQya$gg6O1O-~aiyLSC^s&BEGu+&7{8fGZjX^WlYxdzf)GkJm<3m!EsHl~9o zoQb?ZFxNFk@&S+Qd+`qUqcI!8N?B#>>-OB~@>p4U?0Rppl0#YT%2hU{_a(UYL_71N zY-gB>D{YzJnV{`EtC^Z4WkU)WXRmZ-ulCYbc?H`eEPf1nsiR<s=-HQmdw44hjIw&8 z&OW8#Maeh`(R+<Yl@h$fsTcV1*ilOGs-SXvnDLrh*oSwLvr=bj(?)ZArMZEVxA9=K zeukC2&`5a6CW6OJylDHrDD<nJb9(WPZv~Zag|w-%m^EIp;_i(%yyB58Z*dy#2|an4 zSNgIxRh;4`Omd&N88VROwIQZ|kluOQOMS^q5fgov+R2kek)rFa&+0N1jikXW|8-$G zc*K4yD3w<y%IS%sRNVU!mY8rE0AK{P+%Xru9MCw-am!=7RUim5+JtHBhX8c+_xJCS z=s^%1KtSV5Yzsp`f*&yVle91&<RVmC<wYzHM~hxZ1NN%c3kx69)5<_OZa~HQLhN+h zL_IP$SS=ea)FJT=ztsxfYoL#IJiQ+l*?z}Zk$uoH9$R8fwP)}$>|O~DbeWNV`ocV= z-=jawnW~BRgNq8srqn_JEg#Az?JGL5w}T((K#-EZ-c`iC>AXNEdUhU3DX-1aHMIBh z#d^0Q{ZAzwT3^{JoAqik?M{E+f>T3~{ja&7xn_kFK|g~pbp)BUu6K1yt*7rC7HZdF zODvVQzda^3!0<Is5RaKU8at_2ZYo!hlw+BNp{kkjDiGncry_BRq^?IJeRGRu!C*#Q zsz&nSfA9^F?-$x#K_F2jM@sa(yzGC9FGl2PBOtYKHM8b?CJyz9{05L*xaz<88O`(k zIyH9xhhH#*0DF28yVdz$etYsy$_+aI>gGfcqH`q`YF7hWj8F>EXT*8F|M2=4>fY4@ z_uV{&lzm2)Uzr^BDSYmILUoq1J-mAFvW~x9hPUbNJdx#zy9cx3dSCk;C+?#Jq94{x zXu4KKjsNL+o@ed3vK*Js^%eQXf!P%(eH~+M7F72BO$q{|kH)s`LUSPqb<ix~)Pi8Q zmQ-Ni?DmWKFYRpi!T|2^uZ}OP2hlCy2*$bF=WgCJV>;Qmz(w#p09BwV7T=rdAU+YF zg3-F?nVP0{mYEvSHe65ixo51b6*dF=dpHIo)jE^+vd}!vR8^ocRT1=V2VWH``X9uP z@afRdhd#nb%(UJsdl$NS(Sl<6=d(wtDvrTr6<!7QFt6Cra+Erz1*v=(k$u>`Bb*%T zXy$o1@`1_TJqb?QE%xV;do+vkJP58CKc3Dr&PUez5E*_Dge;)i7_Q5SstS4jp(Ekp zX1<sHg5~&?>lwTwwT$V);J7-My8cNjj#Xs>3x;I@5L)<RNMBPG_KEcBnFus37|}%v zMK>C$&&Dw}I8GMk!2$DVliZ7B2Q$rpz%uATy~)X#zsYr-b?Js4=J(^!i1O^TwVlm| z>F}=zcQ*S#UBe__duOwn+Krhx`*#`cY?k-YW`|CFyxD&xYxKXGeYaL=G<z*yNcco* Rf8d={{r^9VKkUJ?{S8#$^iTi* literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/58.gif b/Public/layui/images/face/58.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f065087d4720326776b26c7b9d2482c9e467bca GIT binary patch literal 2258 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/59.gif b/Public/layui/images/face/59.gif new file mode 100644 index 0000000000000000000000000000000000000000..7081e4f023999fe813726fc83f39d169dedd7ecb GIT binary patch literal 10311 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/6.gif b/Public/layui/images/face/6.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7715bf52817bc577c0d33cd0cbd17da898848a1 GIT binary patch literal 2213 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 P39Yu8!3k0NI&%Lv5<NDC literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/60.gif b/Public/layui/images/face/60.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e15f89d79ed82cdb1f53aed2378d887915528f3 GIT binary patch literal 3245 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/61.gif b/Public/layui/images/face/61.gif new file mode 100644 index 0000000000000000000000000000000000000000..f092d7e351cb195eaf707dbec74d32ced42f432f GIT binary patch literal 2495 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/62.gif b/Public/layui/images/face/62.gif new file mode 100644 index 0000000000000000000000000000000000000000..7fe49840bf69219fa40585741f901fa0b187c044 GIT binary patch literal 2017 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/63.gif b/Public/layui/images/face/63.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf8e23e5b2e83bf4f383cd994510a7a04a74f57c GIT binary patch literal 5871 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/64.gif b/Public/layui/images/face/64.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7797198af0f3bb98361b1b8737784d0a8c2cba0 GIT binary patch literal 6448 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/65.gif b/Public/layui/images/face/65.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bb98f2d8a2502888a61e885d0853d3d3b0661ec GIT binary patch literal 3576 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 E1xN?}xc~qF literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/66.gif b/Public/layui/images/face/66.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb6d077504e3b39871f72150c1f5fa43d4e18bfe GIT binary patch literal 3029 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/67.gif b/Public/layui/images/face/67.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e33f7c4f762b5c4eda2a630793d681345423734 GIT binary patch literal 2701 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/68.gif b/Public/layui/images/face/68.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a6c400d2aee3c2bf384ea98105ea143a7be97a9 GIT binary patch literal 1424 zcmZ9Jc~DbV7{y=A3t1ElhNMIdWI;qKAVvj8Ed*o<G7^1Yh-0Iu#X)T?AS7u@Zg|N9 zB9I6z11P8{s~`o$1wlm-T0s<28J*fH%!p-C76lYbrBCft=)M2kKhE!-?>i?z?C-fY zf(5alX8^k1*gQHqYBXkM{*Y7G(EMlrP>eS7$J{f+!^7j_;}unPZLRHH4}MR}$j4H% zTYhfsG<Ox1osW%)@9F8Cn3$NHoXjgYd*W2l_{8LIkN${LVd?}!UtiyWIDKvHl?xXe z%pIM-v~})3q@J3Z`Z`+m_U+s9b2T+Jmj?z09zW^5RCgoqL~%)J<*~e?TP^Kn<u&CM zRSzCMN;V#AxYpcst958(A|vZmTf2G3?r)NlQURJ?cJ9)>j?TOHx~i%!_4f8&sc(!p zs2+U&ytt$?-IP=LQ*B&A%E`iWb@kU8n_729#@1hL8XO$V%`1pL6rXv#<Z*Y;&8Ftm z%#$x(yf|50Jv21bcJF?FfB%h^JADI#rKRO)V$!?mX~PlIv%bOn{8L(ho<3bvQhfIB zchjb$*;tCPs<yuR!qx4vFJHYH+b-YNez)^ivss}?h*yHh{V__VChDLf_jrLWB_mO1 z&?cD*3d`?zJ$(K8_1M^0OKV4m`9aI=_N@HU=?{lDJ$JKTDB>%U_^otZK_oyB#G8ak z^C18&$KQBKEC?b`<74Pth0Zi<nzPVVXEZK_dCN$vZC8_)@!+K<otv1nLsM9!*+CM! zop6Ckdo)aUcpvN$rP)J*U5t+Qa$Aks(%N-{YowJ>U@NzG)cMYnYrNyx0{3VS0piFK z$mjW@c07jcz~^C01gbSE!4l?jKN*8(2i!I=7z?>i%Ot#X8<hEyVjxENn8H4@z4b=o zIG?m$N$+b+N%pa0#q3^jc_jHx8j0xYO*zUHWm&l}VC_g_JIdbs?r?RrFFDOqVJ?g~ z?GQ*NhHms$p6T|^_FB89A}6*-lm&$gcUek$MK%ip4nKW!-j8U#=x}kUsPUo;>Wmb- z-mk8XNZrg|w7j$@`l};Pt|OIG+|iBX+>+gJ?YG=L5ZNZ!)BDX0xH-$we_;ik>rc<& zf5AWK^s2jcj&)$=URy5zrh&i90*jur_qLH3WW{wSbkDIO(;}hh1uYrcHTEorE!^fn zvgJy?gKUIgghGf8dCDpXK0eH4t@q?bXqSq1I#6t15+F;+KAduNq_;ufveqHc`;1pI z>o3T{DUkcAIx0lMFBz|nhgS#WN;U`=GnuljGNm%W8Bi7eJ|Ie@0}=|F_=%$7jKv4a z9;Xl#6)eG+OchKAN--yv!H(k#v0OkP<j!KqI6=al7U2w2<%0sH(nbZSMrv{fCkT=# zvfXEU&~QDB>lbP{Ko`oV^R}|sVLBkC`3Er40V4ncGrp%n@8uS_oUaYz1HGOSAS4j5 zc~%li7@`klAyO|ro8y7$#as0M!#?iM)dCLCORR!13n>LiI9^D)ND}O{D#%XC2A2An zUS!<szt8{!MQK6;P=`n<J|SWRfvgtOz1(<n`GJ_@Op1h479S?Wtx!TZA617WxO=hu zH-%9)`FbG;3Y>zo!F=h=6kv$@Z)%IRV3mY{$y|aA29O2_CIUdhC|POirAYdWg<xF% zF*Y3d{yP;&0*Etf8wThE$+}R*ifBbtlzR49@4I{-97hWPjAD`7P`XOa@&PIvB}~Jp N$jTJVgOdoY`v;*3C%OOt literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/69.gif b/Public/layui/images/face/69.gif new file mode 100644 index 0000000000000000000000000000000000000000..a02f0b2234a9c03bbfb9578056143ef4516bd965 GIT binary patch literal 2431 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/7.gif b/Public/layui/images/face/7.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6d4db80572a8321fa233d7efd82636fd896bf49 GIT binary patch literal 3398 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 Ch@v0> literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/70.gif b/Public/layui/images/face/70.gif new file mode 100644 index 0000000000000000000000000000000000000000..416c5c14a19fbdaf8fb8d6baf5cf7e31e54f751a GIT binary patch literal 4590 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 B>P7$n literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/71.gif b/Public/layui/images/face/71.gif new file mode 100644 index 0000000000000000000000000000000000000000..c17d60cbd15e80d83629b2220b562a224eec5554 GIT binary patch literal 5304 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 literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/8.gif b/Public/layui/images/face/8.gif new file mode 100644 index 0000000000000000000000000000000000000000..66f967b48da173b68cbfc92986e4426ea35ade74 GIT binary patch literal 4050 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 JEmCgizW{zshWG#g literal 0 HcmV?d00001 diff --git a/Public/layui/images/face/9.gif b/Public/layui/images/face/9.gif new file mode 100644 index 0000000000000000000000000000000000000000..60447400d31b035f56554b29af1aefc76bda1698 GIT binary patch literal 4221 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 literal 0 HcmV?d00001 diff --git a/Public/layui/lay/dest/layui.all.js b/Public/layui/lay/dest/layui.all.js new file mode 100644 index 0000000..1d3cc2a --- /dev/null +++ b/Public/layui/lay/dest/layui.all.js @@ -0,0 +1,5 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;!function(e){"use strict";var t=function(){this.v="1.0.9_rls"};t.fn=t.prototype;var n=document,o=t.fn.cache={},i=function(){var e=n.scripts,t=e[e.length-1].src;return t.substring(0,t.lastIndexOf("/")+1)}(),r=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},l="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),a={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"dest/layui.all"};o.modules={},o.status={},o.timeout=10,o.event={},t.fn.define=function(e,t){var n=this,i="function"==typeof e,r=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return i&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?r.call(n):(n.use(e,r),n)},t.fn.use=function(e,t,u){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[m]=t,y.removeChild(p),function i(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void(o.status[m]?c():setTimeout(i,4))}())}function c(){u.push(layui[m]),e.length>1?f.use(e.slice(1),t,u):"function"==typeof t&&t.apply(layui,u)}var f=this,d=o.dir=o.dir?o.dir:i,y=n.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(f.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=jQuery);var m=e[0],v=0;if(u=u||[],o.host=o.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&a[m]||!layui["layui.all"]&&layui["layui.mobile"]&&a[m])return c(),f;var p=n.createElement("script"),h=(a[m]?d+"lay/":o.base||"")+(f.modules[m]||m)+".js";return p.async=!0,p.charset="utf-8",p.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),o.modules[m]?!function g(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void("string"==typeof o.modules[m]&&o.status[m]?c():setTimeout(g,4))}():(y.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||l?p.addEventListener("load",function(e){s(e,h)},!1):p.attachEvent("onreadystatechange",function(e){s(e,h)})),o.modules[m]=h,f},t.fn.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},t.fn.link=function(e,t,i){var l=this,a=n.createElement("link"),u=n.getElementsByTagName("head")[0];"string"==typeof t&&(i=t);var s=(i||e).replace(/\.|\//g,""),c=a.id="layuicss-"+s,f=0;a.rel="stylesheet",a.href=e+(o.debug?"?v="+(new Date).getTime():""),a.media="all",n.getElementById(c)||u.appendChild(a),"function"==typeof t&&!function d(){return++f>1e3*o.timeout/100?r(e+" timeout"):void(1989===parseInt(l.getStyle(n.getElementById(c),"width"))?function(){t()}():setTimeout(d,100))}()},t.fn.addcss=function(e,t,n){layui.link(o.dir+"css/"+e,t,n)},t.fn.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,t(o)},void(o.onerror=function(e){o.onerror=null,n(e)}))},t.fn.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},t.fn.modules=function(){var e={};for(var t in a)e[t]=a[t];return e}(),t.fn.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?r("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},t.fn.router=function(e){for(var t,n=(e||location.hash).replace(/^#/,"").split("/")||[],o={dir:[]},i=0;i<n.length;i++)t=n[i].split("="),/^\w+=/.test(n[i])?function(){"dir"!==t[0]&&(o[t[0]]=t[1])}():o.dir.push(n[i]),t=null;return o},t.fn.data=function(t,n){if(t=t||"layui",e.JSON&&e.JSON.parse){if(null===n)return delete localStorage[t];n="object"==typeof n?n:{key:n};try{var o=JSON.parse(localStorage[t])}catch(i){var o={}}return n.value&&(o[n.key]=n.value),n.remove&&delete o[n.key],localStorage[t]=JSON.stringify(o),n.key?o[n.key]:o}},t.fn.device=function(t){var n=navigator.userAgent.toLowerCase(),o=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},i={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:o("micromessenger")};return t&&!i[t]&&(i[t]=o(t)),i.android=/android/.test(n),i.ios="ios"===i.os,i},t.fn.hint=function(){return{error:r}},t.fn.each=function(e,t){var n,o=this;if("function"!=typeof t)return o;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return o},t.fn.stope=function(t){t=t||e.event,t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},t.fn.onevent=function(e,t,n){return"string"!=typeof e||"function"!=typeof n?this:(o.event[e+"."+t]=[n],this)},t.fn.event=function(e,t,n){var i=this,r=null,l=t.match(/\(.*\)$/)||[],a=(t=e+"."+t).replace(l,""),u=function(e,t){var o=t&&t.call(i,n);o===!1&&null===r&&(r=!1)};return layui.each(o.event[a],u),l[0]&&layui.each(o.event[t],u),r},e.layui=new t}(window);layui.define(function(a){var i=layui.cache;layui.config({dir:i.dir.replace(/lay\/dest\/$/,"")}),a("layui.all",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},n={exp:function(e){return new RegExp(e,"g")},query:function(e,n,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return c((n||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)});layui.define(function(a){"use strict";function t(a){new p(a)}var e=document,r="getElementById",n="getElementsByTagName",s=0,p=function(a){var t=this,e=t.config=a||{};e.item=s++,t.render(!0)};p.on=function(a,t,e){return a.attachEvent?a.attachEvent("on"+t,function(){e.call(a,window.even)}):a.addEventListener(t,e,!1),p},p.prototype.type=function(){var a=this.config;if("object"==typeof a.cont)return void 0===a.cont.length?2:3},p.prototype.view=function(){var a=this,t=a.config,e=[],r={};if(t.pages=0|t.pages,t.curr=0|t.curr||1,t.groups="groups"in t?0|t.groups:5,t.first="first"in t?t.first:"首页",t.last="last"in t?t.last:"末页",t.prev="prev"in t?t.prev:"上一页",t.next="next"in t?t.next:"下一页",t.pages<=1)return"";for(t.groups>t.pages&&(t.groups=t.pages),r.index=Math.ceil((t.curr+(t.groups>1&&t.groups!==t.pages?1:0))/(0===t.groups?1:t.groups)),t.curr>1&&t.prev&&e.push('<a href="javascript:;" class="layui-laypage-prev" data-page="'+(t.curr-1)+'">'+t.prev+"</a>"),r.index>1&&t.first&&0!==t.groups&&e.push('<a href="javascript:;" class="laypage_first" data-page="1" title="首页">'+t.first+"</a><span>…</span>"),r.poor=Math.floor((t.groups-1)/2),r.start=r.index>1?t.curr-r.poor:1,r.end=r.index>1?function(){var a=t.curr+(t.groups-r.poor-1);return a>t.pages?t.pages:a}():t.groups,r.end-r.start<t.groups-1&&(r.start=r.end-t.groups+1);r.start<=r.end;r.start++)r.start===t.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(t.skin)?'style="background-color:'+t.skin+';"':"")+"></em><em>"+r.start+"</em></span>"):e.push('<a href="javascript:;" data-page="'+r.start+'">'+r.start+"</a>");return t.pages>t.groups&&r.end<t.pages&&t.last&&0!==t.groups&&e.push('<span>…</span><a href="javascript:;" class="layui-laypage-last" title="尾页" data-page="'+t.pages+'">'+t.last+"</a>"),r.flow=!t.prev&&0===t.groups,(t.curr!==t.pages&&t.next||r.flow)&&e.push(function(){return r.flow&&t.curr===t.pages?'<span class="layui-laypage-nomore" title="已没有更多">'+t.next+"</span>":'<a href="javascript:;" class="layui-laypage-next" data-page="'+(t.curr+1)+'">'+t.next+"</a>"}()),'<div class="layui-box layui-laypage layui-laypage-'+(t.skin?function(a){return/^#/.test(a)?"molv":a}(t.skin):"default")+'" id="layui-laypage-'+a.config.item+'">'+e.join("")+function(){return t.skip?'<span class="layui-laypage-total">到第 <input type="number" min="1" onkeyup="this.value=this.value.replace(/\\D/, \'\');" value="'+t.curr+'" class="layui-laypage-skip"> 页 <button type="button" class="layui-laypage-btn">确定</button></span>':""}()+"</div>"},p.prototype.jump=function(a){if(a){for(var t=this,e=t.config,r=a.children,s=a[n]("button")[0],i=a[n]("input")[0],u=0,o=r.length;u<o;u++)"a"===r[u].nodeName.toLowerCase()&&p.on(r[u],"click",function(){var a=0|this.getAttribute("data-page");e.curr=a,t.render()});s&&p.on(s,"click",function(){var a=0|i.value.replace(/\s|\D/g,"");a&&a<=e.pages&&(e.curr=a,t.render())})}},p.prototype.render=function(a){var t=this,n=t.config,s=t.type(),p=t.view();2===s?n.cont.innerHTML=p:3===s?n.cont.html(p):e[r](n.cont).innerHTML=p,n.jump&&n.jump(n,a),t.jump(e[r]("layui-laypage-"+n.item)),n.hash&&!a&&(location.hash="!"+n.hash+"="+n.curr)},a("laypage",t)});layui.define(function(e){"use strict";var t=window,a={path:"",skin:"default",format:"YYYY-MM-DD",min:"1900-01-01 00:00:00",max:"2099-12-31 23:59:59",isv:!1,init:!0},n={},s=document,i="createElement",o="getElementById",l="getElementsByTagName",d=["laydate_box","laydate_void","laydate_click","LayDateSkin","skins/","/laydate.css"];t.laydate=function(e){return e=e||{},n.run(e),laydate},laydate.v="1.1",n.trim=function(e){return e=e||"",e.replace(/^\s|\s$/g,"").replace(/\s+/g," ")},n.digit=function(e){return e<10?"0"+(0|e):e},n.stopmp=function(e){return e=e||t.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this},n.each=function(e,t){for(var a=0,n=e.length;a<n&&t(a,e[a])!==!1;a++);},n.hasClass=function(e,t){return e=e||{},new RegExp("\\b"+t+"\\b").test(e.className)},n.addClass=function(e,t){return e=e||{},n.hasClass(e,t)||(e.className+=" "+t),e.className=n.trim(e.className),this},n.removeClass=function(e,t){if(e=e||{},n.hasClass(e,t)){var a=new RegExp("\\b"+t+"\\b");e.className=e.className.replace(a,"")}return this},n.removeCssAttr=function(e,t){var a=e.style;a.removeProperty?a.removeProperty(t):a.removeAttribute(t)},n.shde=function(e,t){e.style.display=t?"none":"block"},n.query=function(e){if(e&&1===e.nodeType){if("input"!==e.tagName.toLowerCase())throw new Error("选择器elem错误");return e}var t,e=n.trim(e).split(" "),a=s[o](e[0].substr(1));if(a){if(e[1]){if(/^\./.test(e[1])){var i,d=e[1].substr(1),r=new RegExp("\\b"+d+"\\b");return t=[],i=s.getElementsByClassName?a.getElementsByClassName(d):a[l]("*"),n.each(i,function(e,a){r.test(a.className)&&t.push(a)}),t[0]?t:""}return t=a[l](e[1]),t[0]?a[l](e[1]):""}return a}},n.on=function(e,a,s){return e.attachEvent?e.attachEvent("on"+a,function(){s.call(e,t.even)}):e.addEventListener(a,s,!1),n},n.stopMosup=function(e,t){"mouseup"!==e&&n.on(t,"mouseup",function(e){n.stopmp(e)})},n.run=function(e){var t=(n.query,e.elem);t&&(d.elemv=/textarea|input/.test(t.tagName.toLocaleLowerCase())?"value":"innerHTML",("init"in e?e.init:a.init)&&!t[d.elemv]&&(t[d.elemv]=laydate.now(null,e.format||a.format)),n.view(t,e),n.reshow())},n.scroll=function(e){return e=e?"scrollLeft":"scrollTop",s.body[e]|s.documentElement[e]},n.winarea=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},n.isleap=function(e){return e%4===0&&e%100!==0||e%400===0},n.checkVoid=function(e,t,a){var s=[];return e=0|e,t=0|t,a=0|a,e<n.mins[0]?s=["y"]:e>n.maxs[0]?s=["y",1]:e>=n.mins[0]&&e<=n.maxs[0]&&(e==n.mins[0]&&(t<n.mins[1]?s=["m"]:t==n.mins[1]&&a<n.mins[2]&&(s=["d"])),e==n.maxs[0]&&(t>n.maxs[1]?s=["m",1]:t==n.maxs[1]&&a>n.maxs[2]&&(s=["d",1]))),s},n.timeVoid=function(e,t){if(n.ymd[1]+1==n.mins[1]&&n.ymd[2]==n.mins[2]){if(0===t&&e<n.mins[3])return 1;if(1===t&&e<n.mins[4])return 1;if(2===t&&e<n.mins[5])return 1}else if(n.ymd[1]+1==n.maxs[1]&&n.ymd[2]==n.maxs[2]){if(0===t&&e>n.maxs[3])return 1;if(1===t&&e>n.maxs[4])return 1;if(2===t&&e>n.maxs[5])return 1}if(e>(t?59:23))return 1},n.check=function(){var e=n.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,"\\d+\\").replace(/\\$/g,""),t=new RegExp(e),a=n.elem[d.elemv],s=a.match(/\d+/g)||[],i=n.checkVoid(s[0],s[1],s[2]);if(""!==a.replace(/\s/g,"")){if(!t.test(a))return n.elem[d.elemv]="",n.msg("日期不符合格式,请重新选择。"),1;if(i[0])return n.elem[d.elemv]="",n.msg("日期不在有效期内,请重新选择。"),1;i.value=n.elem[d.elemv].match(t).join(),s=i.value.match(/\d+/g),s[1]<1?(s[1]=1,i.auto=1):s[1]>12?(s[1]=12,i.auto=1):s[1].length<2&&(i.auto=1),s[2]<1?(s[2]=1,i.auto=1):s[2]>n.months[(0|s[1])-1]?(s[2]=31,i.auto=1):s[2].length<2&&(i.auto=1),s.length>3&&(n.timeVoid(s[3],0)&&(i.auto=1),n.timeVoid(s[4],1)&&(i.auto=1),n.timeVoid(s[5],2)&&(i.auto=1)),i.auto?n.creation([s[0],0|s[1],0|s[2]],1):i.value!==n.elem[d.elemv]&&(n.elem[d.elemv]=i.value)}},n.months=[31,null,31,30,31,30,31,31,30,31,30,31],n.viewDate=function(e,t,a){var s=(n.query,{}),i=new Date;e<(0|n.mins[0])&&(e=0|n.mins[0]),e>(0|n.maxs[0])&&(e=0|n.maxs[0]),i.setFullYear(e,t,a),s.ymd=[i.getFullYear(),i.getMonth(),i.getDate()],n.months[1]=n.isleap(s.ymd[0])?29:28,i.setFullYear(s.ymd[0],s.ymd[1],1),s.FDay=i.getDay(),s.PDay=n.months[0===t?11:t-1]-s.FDay+1,s.NDay=1,n.each(d.tds,function(e,t){var a,i=s.ymd[0],o=s.ymd[1]+1;t.className="",e<s.FDay?(t.innerHTML=a=e+s.PDay,n.addClass(t,"laydate_nothis"),1===o&&(i-=1),o=1===o?12:o-1):e>=s.FDay&&e<s.FDay+n.months[s.ymd[1]]?(t.innerHTML=a=e-s.FDay+1,e-s.FDay+1===s.ymd[2]&&(n.addClass(t,d[2]),s.thisDay=t)):(t.innerHTML=a=s.NDay++,n.addClass(t,"laydate_nothis"),12===o&&(i+=1),o=12===o?1:o+1),n.checkVoid(i,o,a)[0]&&n.addClass(t,d[1]),n.options.festival&&n.festival(t,o+"."+a),t.setAttribute("y",i),t.setAttribute("m",o),t.setAttribute("d",a),i=o=a=null}),n.valid=!n.hasClass(s.thisDay,d[1]),n.ymd=s.ymd,d.year.value=n.ymd[0]+"年",d.month.value=n.digit(n.ymd[1]+1)+"月",n.each(d.mms,function(e,t){var a=n.checkVoid(n.ymd[0],(0|t.getAttribute("m"))+1);"y"===a[0]||"m"===a[0]?n.addClass(t,d[1]):n.removeClass(t,d[1]),n.removeClass(t,d[2]),a=null}),n.addClass(d.mms[n.ymd[1]],d[2]),s.times=[0|n.inymd[3]||0,0|n.inymd[4]||0,0|n.inymd[5]||0],n.each(new Array(3),function(e){n.hmsin[e].value=n.digit(n.timeVoid(s.times[e],e)?0|n.mins[e+3]:0|s.times[e])}),n[n.valid?"removeClass":"addClass"](d.ok,d[1])},n.festival=function(e,t){var a;switch(t){case"1.1":a="元旦";break;case"3.8":a="妇女";break;case"4.5":a="清明";break;case"5.1":a="劳动";break;case"6.1":a="儿童";break;case"9.10":a="教师";break;case"10.1":a="国庆"}a&&(e.innerHTML=a),a=null},n.viewYears=function(e){var t=n.query,a="";n.each(new Array(14),function(t){a+=7===t?"<li "+(parseInt(d.year.value)===e?'class="'+d[2]+'"':"")+' y="'+e+'">'+e+"年</li>":'<li y="'+(e-7+t)+'">'+(e-7+t)+"年</li>"}),t("#laydate_ys").innerHTML=a,n.each(t("#laydate_ys li"),function(e,t){"y"===n.checkVoid(t.getAttribute("y"))[0]?n.addClass(t,d[1]):n.on(t,"click",function(e){n.stopmp(e).reshow(),n.viewDate(0|this.getAttribute("y"),n.ymd[1],n.ymd[2])})})},n.initDate=function(){var e=(n.query,new Date),t=n.elem[d.elemv].match(/\d+/g)||[];t.length<3&&(t=n.options.start.match(/\d+/g)||[],t.length<3&&(t=[e.getFullYear(),e.getMonth()+1,e.getDate()])),n.inymd=t,n.viewDate(t[0],t[1]-1,t[2])},n.iswrite=function(){var e=n.query,t={time:e("#laydate_hms")};n.shde(t.time,!n.options.istime),n.shde(d.oclear,!("isclear"in n.options?n.options.isclear:1)),n.shde(d.otoday,!("istoday"in n.options?n.options.istoday:1)),n.shde(d.ok,!("issure"in n.options?n.options.issure:1))},n.orien=function(e,t){var a,s=n.elem.getBoundingClientRect();e.style.left=s.left+(t?0:n.scroll(1))+"px",a=s.bottom+e.offsetHeight/1.5<=n.winarea()?s.bottom-1:s.top>e.offsetHeight/1.5?s.top-e.offsetHeight+1:n.winarea()-e.offsetHeight,e.style.top=Math.max(a+(t?0:n.scroll()),1)+"px"},n.follow=function(e){n.options.fixed?(e.style.position="fixed",n.orien(e,1)):(e.style.position="absolute",n.orien(e))},n.viewtb=function(){var e,t=[],a=["日","一","二","三","四","五","六"],o={},d=s[i]("table"),r=s[i]("thead");return r.appendChild(s[i]("tr")),o.creath=function(e){var t=s[i]("th");t.innerHTML=a[e],r[l]("tr")[0].appendChild(t),t=null},n.each(new Array(6),function(a){t.push([]),e=d.insertRow(0),n.each(new Array(7),function(n){t[a][n]=0,0===a&&o.creath(n),e.insertCell(n)})}),d.insertBefore(r,d.children[0]),d.id=d.className="laydate_table",e=t=null,d.outerHTML.toLowerCase()}(),n.view=function(e,t){var o,l=n.query,r={};t=t||e,n.elem=e,n.options=t,n.options.format||(n.options.format=a.format),n.options.start=n.options.start||"",n.mm=r.mm=[n.options.min||a.min,n.options.max||a.max],n.mins=r.mm[0].match(/\d+/g),n.maxs=r.mm[1].match(/\d+/g),n.box?n.shde(n.box):(o=s[i]("div"),o.id=d[0],o.className=d[0],o.style.cssText="position: absolute;",o.setAttribute("name","laydate-v"+laydate.v),o.innerHTML=r.html='<div class="laydate_top"><div class="laydate_ym laydate_y" id="laydate_YY"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_y" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms"><a class="laydate_tab laydate_chtop"><cite></cite></a><ul id="laydate_ys"></ul><a class="laydate_tab laydate_chdown"><cite></cite></a></div></div><div class="laydate_ym laydate_m" id="laydate_MM"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_m" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms" id="laydate_ms">'+function(){var e="";return n.each(new Array(12),function(t){e+='<span m="'+t+'">'+n.digit(t+1)+"月</span>"}),e}()+"</div></div></div>"+n.viewtb+'<div class="laydate_bottom"><ul id="laydate_hms"><li class="laydate_sj">时间</li><li><input readonly>:</li><li><input readonly>:</li><li><input readonly></li></ul><div class="laydate_time" id="laydate_time"></div><div class="laydate_btn"><a id="laydate_clear">清空</a><a id="laydate_today">今天</a><a id="laydate_ok">确认</a></div>'+(a.isv?'<a href="http://sentsin.com/layui/laydate/" class="laydate_v" target="_blank">laydate-v'+laydate.v+"</a>":"")+"</div>",s.body.appendChild(o),n.box=l("#"+d[0]),n.events(),o=null),n.follow(n.box),t.zIndex?n.box.style.zIndex=t.zIndex:n.removeCssAttr(n.box,"z-index"),n.stopMosup("click",n.box),n.initDate(),n.iswrite(),n.check()},n.reshow=function(){return n.each(n.query("#"+d[0]+" .laydate_show"),function(e,t){n.removeClass(t,"laydate_show")}),this},n.close=function(){n.reshow(),n.shde(n.query("#"+d[0]),1),n.elem=null},n.parse=function(e,t,s){return e=e.concat(t),s=s||(n.options?n.options.format:a.format),s.replace(/YYYY|MM|DD|hh|mm|ss/g,function(t,a){return e.index=0|++e.index,n.digit(e[e.index])})},n.creation=function(e,t){var a=(n.query,n.hmsin),s=n.parse(e,[a[0].value,a[1].value,a[2].value]);n.elem[d.elemv]=s,t||(n.close(),"function"==typeof n.options.choose&&n.options.choose(s))},n.events=function(){var e=n.query,a={box:"#"+d[0]};n.addClass(s.body,"laydate_body"),d.tds=e("#laydate_table td"),d.mms=e("#laydate_ms span"),d.year=e("#laydate_y"),d.month=e("#laydate_m"),n.each(e(a.box+" .laydate_ym"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.addClass(this[l]("div")[0],"laydate_show"),e||(a.YY=parseInt(d.year.value),n.viewYears(a.YY))})}),n.on(e(a.box),"click",function(){n.reshow()}),a.tabYear=function(e){0===e?n.ymd[0]--:1===e?n.ymd[0]++:2===e?a.YY-=14:a.YY+=14,e<2?(n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2]),n.reshow()):n.viewYears(a.YY)},n.each(e("#laydate_YY .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t),a.tabYear(e)})}),a.tabMonth=function(e){e?(n.ymd[1]++,12===n.ymd[1]&&(n.ymd[0]++,n.ymd[1]=0)):(n.ymd[1]--,n.ymd[1]===-1&&(n.ymd[0]--,n.ymd[1]=11)),n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2])},n.each(e("#laydate_MM .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),a.tabMonth(e)})}),n.each(e("#laydate_ms span"),function(e,t){n.on(t,"click",function(e){n.stopmp(e).reshow(),n.hasClass(this,d[1])||n.viewDate(n.ymd[0],0|this.getAttribute("m"),n.ymd[2])})}),n.each(e("#laydate_table td"),function(e,t){n.on(t,"click",function(e){n.hasClass(this,d[1])||(n.stopmp(e),n.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),d.oclear=e("#laydate_clear"),n.on(d.oclear,"click",function(){n.elem[d.elemv]="",n.close()}),d.otoday=e("#laydate_today"),n.on(d.otoday,"click",function(){var e=new Date;n.creation([e.getFullYear(),e.getMonth()+1,e.getDate()])}),d.ok=e("#laydate_ok"),n.on(d.ok,"click",function(){n.valid&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])}),a.times=e("#laydate_time"),n.hmsin=a.hmsin=e("#laydate_hms input"),a.hmss=["小时","分钟","秒数"],a.hmsarr=[],n.msg=function(t,s){var i='<div class="laydte_hsmtex">'+(s||"提示")+"<span>×</span></div>";"string"==typeof t?(i+="<p>"+t+"</p>",n.shde(e("#"+d[0])),n.removeClass(a.times,"laydate_time1").addClass(a.times,"laydate_msg")):(a.hmsarr[t]?i=a.hmsarr[t]:(i+='<div id="laydate_hmsno" class="laydate_hmsno">',n.each(new Array(0===t?24:60),function(e){i+="<span>"+e+"</span>"}),i+="</div>",a.hmsarr[t]=i),n.removeClass(a.times,"laydate_msg"),n[0===t?"removeClass":"addClass"](a.times,"laydate_time1")),n.addClass(a.times,"laydate_show"),a.times.innerHTML=i},a.hmson=function(t,a){var s=e("#laydate_hmsno span"),i=n.valid?null:1;n.each(s,function(e,s){i?n.addClass(s,d[1]):n.timeVoid(e,a)?n.addClass(s,d[1]):n.on(s,"click",function(e){n.hasClass(this,d[1])||(t.value=n.digit(0|this.innerHTML))})}),n.addClass(s[0|t.value],"laydate_click")},n.each(a.hmsin,function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.msg(e,a.hmss[e]),a.hmson(this,e)})}),n.on(s,"mouseup",function(){var t=e("#"+d[0]);t&&"none"!==t.style.display&&(n.check()||n.close())}).on(s,"keydown",function(e){e=e||t.event;var a=e.keyCode;13===a&&n.elem&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])})},laydate.reset=function(){n.box&&n.elem&&n.follow(n.box)},laydate.now=function(e,t){var a=new Date(0|e?function(e){return e<864e5?+new Date+864e5*e:e}(parseInt(e)):+new Date);return n.parse([a.getFullYear(),a.getMonth()+1,a.getDate()],[a.getHours(),a.getMinutes(),a.getSeconds()],t)},layui.addcss("modules/laydate/laydate.css",function(){},"laydatecss"),e("laydate",laydate)});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"]},r={v:"3.0.2",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):r.link("skin/"+e.extend),this):this},link:function(t,n,a){if(r.path){var o=i("head")[0],s=document.createElement("link");"string"==typeof n&&(a=n);var l=(a||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,i("#"+f)[0]||o.appendChild(s),"function"==typeof n&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(i("#"+f).css("width"))?n():setTimeout(u,100))}()}},ready:function(e){var t="skinlayercss",i="302";return a?layui.addcss("modules/layer/default/layer.css?v="+r.v+i,e,t):r.link("skin/default/layer.css?v="+r.v+i,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),r.ready(function(){document.body?t.creat():setTimeout(function(){t.creat()},50)})};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; background-color:"+(r.shade[1]||"#000")+"; opacity:"+(r.shade[0]||r.shade)+"; filter:alpha(opacity="+(100*r.shade[0]||100*r.shade)+");")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'<i class="layui-layer-TipsG"></i>',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]&&e.layero.addClass(l.anim[t.anim]).data("anim",!0)}},s.pt.auto=function(e){function t(e){e=s.find(e),e.height(f[1]-c-u-2*(0|parseFloat(e.css("padding"))))}var a=this,o=a.config,s=i("#"+l[0]+e);""===o.area[0]&&o.maxWidth>0&&(r.ie&&r.ie<8&&o.btn&&s.width(s.innerWidth()),s.outerWidth()>o.maxWidth&&s.width(o.maxWidth));var f=[s.innerWidth(),s.innerHeight()],c=s.find(l[1]).outerHeight()||0,u=s.find("."+l[6]).outerHeight()||0;switch(o.type){case 2:t("iframe");break;default:""===o.area[1]?o.fixed&&f[1]>=n.height()&&(f[1]=n.height(),t("."+l[5])):t("."+l[5])}return a},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("anim")&&t.addClass(a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),setTimeout(function(){f()},r.ie&&r.ie<10||!t.data("anim")?0:200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'<textarea class="layui-layer-input"'+a+">"+(e.value||"")+"</textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input" value="'+(e.value||"")+'">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,n="";if(e>0)for(n='<span class="layui-layer-tabnow">'+t[0].title+"</span>";i<e;i++)n+="<span>"+t[i].title+"</span>";return n}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,n="";if(e>0)for(n='<li class="layui-layer-tabli xubox_tab_layer">'+(t[0].content||"no content")+"</li>";i<e;i++)n+='<li class="layui-layer-tabli">'+(t[i].content||"no content")+"</li>";return n}()+"</ul>",success:function(t){var a=t.find(".layui-layer-title").children(),o=t.find(".layui-layer-tabmain").children();a.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var n=i(this),a=n.index();n.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),o.eq(a).show().siblings().hide(),"function"==typeof e.change&&e.change(a)}),"function"==typeof n&&n(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){u.length<=1||(f.start=s.imgIndex-1,r.close(s.index),setTimeout(function(){r.photos(t,!0,e)},200))},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,anim:5*Math.random()|0,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常<br>是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.jquery),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);!function(e,t){"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(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x<d;x++)if(a=e[x],a||0===a)if("object"===pe.type(a))pe.merge(v,a.nodeType?[a]:a);else if(Ue.test(a)){for(u=u||y.appendChild(t.createElement("div")),l=(We.exec(a)||["",""])[1].toLowerCase(),f=Xe[l]||Xe._default,u.innerHTML=f[1]+pe.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!fe.leadingWhitespace&&$e.test(a)&&v.push(t.createTextNode($e.exec(a)[0])),!fe.tbody)for(a="table"!==l||Ve.test(a)?"<table>"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r<i;r++)pe.event.add(t,n,s[n][r])}a.data&&(a.data=pe.extend({},a.data))}}function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!fe.noCloneEvent&&t[pe.expando]){i=pe._data(t);for(r in i.events)pe.removeEvent(t,r,i.handle);t.removeAttribute(pe.expando)}"script"===n&&t.text!==e.text?(C(t).text=e.text,E(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),fe.html5Clone&&e.innerHTML&&!pe.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Be.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}}function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-1,p=t[0],g=pe.isFunction(p);if(g||f>1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c<f;c++)o=l,c!==d&&(o=pe.clone(o,!0,!0),a&&pe.merge(s,h(o,"script"))),n.call(e[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,pe.map(s,E),c=0;c<a;c++)o=s[c],Ie.test(o.type||"")&&!pe._data(o,"globalEval")&&pe.contains(u,o)&&(o.src?pe._evalUrl&&pe._evalUrl(o.src):pe.globalEval((o.text||o.textContent||o.innerHTML||"").replace(ot,"")));l=i=null}return e}function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||pe.cleanData(h(r)),r.parentNode&&(n&&pe.contains(r.ownerDocument,r)&&g(h(r,"script")),r.parentNode.removeChild(r));return e}function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n[0],"display");return n.detach(),r}function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(ut||pe("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a<s;a++)r=e[a],r.style&&(o[a]=pe._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Re(r)&&(o[a]=pe._data(r,"olddisplay",j(r.nodeName)))):(i=Re(r),(n&&"none"!==n||!i)&&pe._data(r,"olddisplay",i?n:pe.css(r,"display"))));for(a=0;a<s;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function _(e,t,n){var r=bt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function F(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=pe.css(e,n+Oe[o],!0,i)),r?("content"===n&&(a-=pe.css(e,"padding"+Oe[o],!0,i)),"margin"!==n&&(a-=pe.css(e,"border"+Oe[o]+"Width",!0,i))):(a+=pe.css(e,"padding"+Oe[o],!0,i),"padding"!==n&&(a+=pe.css(e,"border"+Oe[o]+"Width",!0,i)));return a}function M(t,n,r){var i=!0,o="width"===n?t.offsetWidth:t.offsetHeight,a=ht(t),s=fe.boxSizing&&"border-box"===pe.css(t,"boxSizing",!1,a);if(re.msFullscreenElement&&e.top!==e&&t.getClientRects().length&&(o=Math.round(100*t.getBoundingClientRect()[n])),o<=0||null==o){if(o=gt(t,n,a),(o<0||null==o)&&(o=t.style[n]),ft.test(o))return o;i=s&&(fe.boxSizingReliable()||o===t.style[n]),o=parseFloat(o)||0}return o+F(t,n,r||(s?"border":"content"),i,a)+"px"}function O(e,t,n,r,i){return new O.prototype.init(e,t,n,r,i)}function R(){return e.setTimeout(function(){Nt=void 0}),Nt=pe.now()}function P(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)n=Oe[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function B(e,t,n){for(var r,i=($.tweeners[t]||[]).concat($.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function W(e,t,n){var r,i,o,a,s,u,l,c,f=this,d={},p=e.style,h=e.nodeType&&Re(e),g=pe._data(e,"fxshow");n.queue||(s=pe._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,f.always(function(){f.always(function(){s.unqueued--,pe.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],l=pe.css(e,"display"),c="none"===l?pe._data(e,"olddisplay")||j(e.nodeName):l,"inline"===c&&"none"===pe.css(e,"float")&&(fe.inlineBlockNeedsLayout&&"inline"!==j(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",fe.shrinkWrapBlocks()||f.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],St.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}d[r]=g&&g[r]||pe.style(e,r)}else l=void 0;if(pe.isEmptyObject(d))"inline"===("none"===l?j(e.nodeName):l)&&(p.display=l);else{g?"hidden"in g&&(h=g.hidden):g=pe._data(e,"fxshow",{}),o&&(g.hidden=!h),h?pe(e).show():f.done(function(){pe(e).hide()}),f.done(function(){var t;pe._removeData(e,"fxshow");for(t in d)pe.style(e,t,d[t])});for(r in d)a=B(h?g[r]:0,r,f),r in g||(g[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function I(e,t){var n,r,i,o,a;for(n in e)if(r=pe.camelCase(n),i=t[r],o=e[n],pe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=pe.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function $(e,t,n){var r,i,o=0,a=$.prefilters.length,s=pe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Nt||R(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),o<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:pe.extend({},t),opts:pe.extend(!0,{specialEasing:{},easing:pe.easing._default},n),originalProperties:t,originalOptions:n,startTime:Nt||R(),duration:n.duration,tweens:[],createTween:function(t,n){var r=pe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(I(c,l.opts.specialEasing);o<a;o++)if(r=$.prefilters[o].call(l,e,c,l.opts))return pe.isFunction(r.stop)&&(pe._queueHooks(l.elem,l.opts.queue).stop=pe.proxy(r.stop,r)),r;return pe.map(c,B,l),pe.isFunction(l.opts.start)&&l.opts.start.call(e,l),pe.fx.timer(pe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){return pe.attr(e,"class")||""}function X(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(De)||[];if(pe.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function U(e,t,n,r){function i(s){var u;return o[s]=!0,pe.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||a||o[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},a=e===Qt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function V(e,t){var n,r,i=pe.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&pe.extend(!0,e,n),e}function Y(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r||(r=a)}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}function J(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(a=l[u+" "+o]||l["* "+o],!a)for(i in l)if(s=i.split(" "),s[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){a===!0?a=l[i]:l[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function G(e){return e.style&&e.style.display||pe.css(e,"display")}function K(e){for(;e&&1===e.nodeType;){if("none"===G(e)||"hidden"===e.type)return!0;e=e.parentNode}return!1}function Q(e,t,n,r){var i;if(pe.isArray(t))pe.each(t,function(t,i){n||rn.test(e)?r(e,i):Q(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==pe.type(t))r(e,t);else for(i in t)Q(e+"["+i+"]",t[i],n,r)}function Z(){try{return new e.XMLHttpRequest}catch(t){}}function ee(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function te(e){return pe.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var ne=[],re=e.document,ie=ne.slice,oe=ne.concat,ae=ne.push,se=ne.indexOf,ue={},le=ue.toString,ce=ue.hasOwnProperty,fe={},de="1.12.3",pe=function(e,t){return new pe.fn.init(e,t)},he=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ge=/^-ms-/,me=/-([\da-z])/gi,ye=function(e,t){return t.toUpperCase()};pe.fn=pe.prototype={jquery:de,constructor:pe,selector:"",length:0,toArray:function(){return ie.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:ie.call(this)},pushStack:function(e){var t=pe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return pe.each(this,e)},map:function(e){return this.pushStack(pe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(ie.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ae,sort:ne.sort,splice:ne.splice},pe.extend=pe.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||pe.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(l&&n&&(pe.isPlainObject(n)||(t=pe.isArray(n)))?(t?(t=!1,o=e&&pe.isArray(e)?e:[]):o=e&&pe.isPlainObject(e)?e:{},a[r]=pe.extend(l,o,n)):void 0!==n&&(a[r]=n));return a},pe.extend({expando:"jQuery"+(de+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===pe.type(e)},isArray:Array.isArray||function(e){return"array"===pe.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!pe.isArray(e)&&t-parseFloat(t)+1>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(he,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?pe.merge(r,"string"==typeof e?[e]:e):ae.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(se)return se.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o,a=0,s=[];if(n(e))for(i=e.length;a<i;a++)o=t(e[a],a,r),null!=o&&s.push(o);else for(a in e)o=t(e[a],a,r),null!=o&&s.push(o);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(i=e[t],t=e,e=i),pe.isFunction(e))return n=ie.call(arguments,2),r=function(){return e.apply(t||this,n.concat(ie.call(arguments)))},r.guid=e.guid=e.guid||pe.guid++,r},now:function(){return+new Date},support:fe}),"function"==typeof Symbol&&(pe.fn[Symbol.iterator]=ne[Symbol.iterator]),pe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ue["[object "+t+"]"]=t.toLowerCase()});var ve=function(e){function t(e,t,n,r){var i,o,a,s,u,l,f,p,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:B)!==H&&L(t),t=t||H,_)){if(11!==g&&(l=ye.exec(e)))if(i=l[1]){if(9===g){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(h&&(a=h.getElementById(i))&&R(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return Q.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return Q.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!X[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,p=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(xe,"\\$&"):t.setAttribute("id",s=P),f=N(e),o=f.length,u=de.test(s)?"#"+s:"[id='"+s+"']";o--;)f[o]=u+" "+d(f[o]);p=f.join(","),h=ve.test(e)&&c(t.parentNode)||t}if(p)try{return Q.apply(n,h.querySelectorAll(p)),n}catch(m){}finally{s===P&&t.removeAttribute("id")}}}return S(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[P]||(t[P]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(s=u[r])&&s[0]===W&&s[1]===o)return c[2]=s[2];if(u[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i<o;i++)t(e,n[i],r);return r}function m(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function y(e,t,n,i,o,a){return i&&!i[P]&&(i=y(i)),o&&!o[P]&&(o=y(o,a)),r(function(r,a,s,u){var l,c,f,d=[],p=[],h=a.length,y=r||g(t||"*",s.nodeType?[s]:s,[]),v=!e||!r&&t?y:m(y,d,e,s,u),x=n?o||(r?e:h||i)?[]:a:v;if(n&&n(v,x,s,u),i)for(l=m(x,p),i(l,[],s,u),c=l.length;c--;)(f=l[c])&&(x[p[c]]=!(v[p[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(v[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):d[c])>-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s<i;s++)if(n=T.relative[e[s].type])c=[p(h(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;r<i&&!T.relative[e[r].type];r++);return y(s>1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s<r&&v(e.slice(s,r)),r<i&&v(e=e.slice(r)),r<i&&d(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",ae=new RegExp(ne+"+","g"),se=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="<a id='"+P+"'></a><select id='"+P+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(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(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=s(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,N=t.tokenize=function(e,n){var r,i,o,a,s,u,l,c=z[e+" "];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(i=ue.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),r=!1,(i=le.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(se," ")}),s=s.slice(r.length));for(a in T.filter)!(i=pe[a].exec(s))||l[a]&&!(i=l[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},k=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=N(e)),n=t.length;n--;)o=v(t[n]),o[P]?r.push(o):i.push(o);o=X(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,f=!r&&N(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t<i;t++)if(pe.contains(r[t],this))return!0}));for(t=0;t<i;t++)pe.find(e,r[t],n);return n=this.pushStack(i>1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(pe.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=we.test(e)||"string"!=typeof e?pe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u<a.length;)a[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=a.length,n=!1);e.memory||(n=!1),t=!1,i&&(a=n?[]:"")},c={add:function(){return a&&(n&&!t&&(u=a.length-1,s.push(n)),function r(t){pe.each(t,function(t,n){pe.isFunction(n)?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==pe.type(n)&&r(n)})}(arguments),n&&!t&&l()),this},remove:function(){return pe.each(arguments,function(e,t){for(var n;(n=pe.inArray(t,a,n))>-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i<a;i++)o[i]&&pe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--s;return s||u.resolveWith(r,o),u.promise()}});var je;pe.fn.ready=function(e){return pe.ready.promise().done(e),this},pe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?pe.readyWait++:pe.ready(!0)},ready:function(e){(e===!0?--pe.readyWait:pe.isReady)||(pe.isReady=!0,e!==!0&&--pe.readyWait>0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?pe.queue(this[0],e):void 0===t?this:this.each(function(){var n=pe.queue(this,e,t);pe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&pe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){pe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=pe.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=pe._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),function(){var e;fe.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return n=re.getElementsByTagName("body")[0],n&&n.style?(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(re.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var Fe=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Me=new RegExp("^(?:([+-])=|)("+Fe+")([a-z%]*)$","i"),Oe=["Top","Right","Bottom","Left"],Re=function(e,t){return e=t||e,"none"===pe.css(e,"display")||!pe.contains(e.ownerDocument,e)},Pe=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===pe.type(n)){i=!0;for(s in n)Pe(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,pe.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(pe(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},Be=/^(?:checkbox|radio)$/i,We=/<([\w:-]+)/,Ie=/^$|\/(?:java|ecma)script/i,$e=/^\s+/,ze="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";!function(){var e=re.createElement("div"),t=re.createDocumentFragment(),n=re.createElement("input");e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav></:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="<textarea>x</textarea>",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:fe.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/<tbody/i;!function(){var t,n,r=re.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(fe[t]=n in e)||(r.setAttribute(n,"t"),fe[t]=r.attributes[n].expando===!1);r=null}();var Ye=/^(?:input|select|textarea)$/i,Je=/^key/,Ge=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ke=/^(?:focusinfocus|focusoutblur)$/,Qe=/^([^.]*)(?:\.(.+)|)/;pe.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe._data(e);if(m){for(n.handler&&(u=n,n=u.handler,i=u.selector),n.guid||(n.guid=pe.guid++),(a=m.events)||(a=m.events={}),(c=m.handle)||(c=m.handle=function(e){return"undefined"==typeof pe||e&&pe.event.triggered===e.type?void 0:pe.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(De)||[""],s=t.length;s--;)o=Qe.exec(t[s])||[],p=g=o[1],h=(o[2]||"").split(".").sort(),p&&(l=pe.event.special[p]||{},p=(i?l.delegateType:l.bindType)||p,l=pe.event.special[p]||{},f=pe.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&pe.expr.match.needsContext.test(i),namespace:h.join(".")},u),(d=a[p])||(d=a[p]=[],d.delegateCount=0,l.setup&&l.setup.call(e,r,h,c)!==!1||(e.addEventListener?e.addEventListener(p,c,!1):e.attachEvent&&e.attachEvent("on"+p,c))),l.add&&(l.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,f):d.push(f),pe.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe.hasData(e)&&pe._data(e);if(m&&(c=m.events)){for(t=(t||"").match(De)||[""],l=t.length;l--;)if(s=Qe.exec(t[l])||[],p=g=s[1],h=(s[2]||"").split(".").sort(),p){for(f=pe.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=c[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||pe.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)pe.event.remove(e,p+t[l],n,r,!0);pe.isEmptyObject(c)&&(delete m.handle,pe._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,u,l,c,f,d=[r||re],p=ce.call(t,"type")?t.type:t,h=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=c=r=r||re,3!==r.nodeType&&8!==r.nodeType&&!Ke.test(p+pe.event.triggered)&&(p.indexOf(".")>-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n<s;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?pe(i,this).index(u)>-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[pe.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Ge.test(i)?this.mouseHooks:Je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new pe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||re),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||re,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==b()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===b()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(pe.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return pe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){var r=pe.extend(new pe.Event,n,{type:e,isSimulated:!0});pe.event.trigger(r,null,t),r.isDefaultPrevented()&&n.preventDefault()}},pe.removeEvent=re.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){var r="on"+t;e.detachEvent&&("undefined"==typeof e[r]&&(e[r]=null),e.detachEvent(r,n))},pe.Event=function(e,t){return this instanceof pe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?v:x):this.type=e,t&&pe.extend(this,t),this.timeStamp=e&&e.timeStamp||pe.now(),void(this[pe.expando]=!0)):new pe.Event(e,t)},pe.Event.prototype={constructor:pe.Event,isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=v,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=v,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=v,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},pe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){pe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||pe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),fe.submit||(pe.event.special.submit={setup:function(){return!pe.nodeName(this,"form")&&void pe.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=pe.nodeName(t,"input")||pe.nodeName(t,"button")?pe.prop(t,"form"):void 0;n&&!pe._data(n,"submit")&&(pe.event.add(n,"submit._submit",function(e){e._submitBubble=!0}),pe._data(n,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode&&!e.isTrigger&&pe.event.simulate("submit",this.parentNode,e))},teardown:function(){return!pe.nodeName(this,"form")&&void pe.event.remove(this,"._submit")}}),fe.change||(pe.event.special.change={setup:function(){return Ye.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(pe.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),pe.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),pe.event.simulate("change",this,e)})),!1):void pe.event.add(this,"beforeactivate._change",function(e){var t=e.target;Ye.test(t.nodeName)&&!pe._data(t,"change")&&(pe.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||pe.event.simulate("change",this.parentNode,e)}),pe._data(t,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return pe.event.remove(this,"._change"),!Ye.test(this.nodeName)}}),fe.focusin||pe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){pe.event.simulate(t,e.target,pe.event.fix(e))};pe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=pe._data(r,t);i||r.addEventListener(e,n,!0),pe._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=pe._data(r,t)-1;i?pe._data(r,t,i):(r.removeEventListener(e,n,!0),pe._removeData(r,t))}}}),pe.fn.extend({on:function(e,t,n,r){return w(this,e,t,n,r)},one:function(e,t,n,r){return w(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,pe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=x),this.each(function(){pe.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){pe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return pe.event.trigger(e,t,n,!0)}});var Ze=/ jQuery\d+="(?:null|\d+)"/g,et=new RegExp("<(?:"+ze+")[\\s/>]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/<script|<style|<link/i,rt=/checked\s*(?:[^=]|=\s*.checked.)/i,it=/^true\/(.*)/,ot=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(pe.cleanData(h(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return S(this,arguments,function(t){var n=this.parentNode;pe.inArray(this,e)<0&&(pe.cleanData(h(this)), +n&&n.replaceChild(t,this))},e)}}),pe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){pe.fn[e]=function(e){for(var n,r=0,i=[],o=pe(e),a=o.length-1;r<=a;r++)n=r===a?this:this.clone(!0),pe(o[r])[t](n),ae.apply(i,n.get());return this.pushStack(i)}});var ut,lt={HTML:"block",BODY:"block"},ct=/^margin/,ft=new RegExp("^("+Fe+")(?!px)[a-z%]+$","i"),dt=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i},pt=re.documentElement;!function(){function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=i=s=!1,r=a=!0,e.getComputedStyle&&(c=e.getComputedStyle(l),n="1%"!==(c||{}).top,s="2px"===(c||{}).marginLeft,i="4px"===(c||{width:"4px"}).width,l.style.marginRight="50%",r="4px"===(c||{marginRight:"4px"}).marginRight,t=l.appendChild(re.createElement("div")),t.style.cssText=l.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",l.style.width="1px",a=!parseFloat((e.getComputedStyle(t)||{}).marginRight),l.removeChild(t)),l.style.display="none",o=0===l.getClientRects().length,o&&(l.style.display="",l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a<i;a++)o[t[a]]=pe.css(e,t[a],!1,r);return o}return void 0!==n?pe.style(e,t,n):pe.css(e,t)},e,t,arguments.length>1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r<i;r++)n=e[r],$.tweeners[n]=$.tweeners[n]||[],$.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?$.prefilters.unshift(e):$.prefilters.push(e)}}),pe.speed=function(e,t,n){var r=e&&"object"==typeof e?pe.extend({},e):{complete:n||!n&&t||pe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!pe.isFunction(t)&&t};return r.duration=pe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in pe.fx.speeds?pe.fx.speeds[r.duration]:pe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){pe.isFunction(r.old)&&r.old.call(this),r.queue&&pe.dequeue(this,r.queue)},r},pe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Re).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=pe.isEmptyObject(e),o=pe.speed(t,n,r),a=function(){var t=$(this,pe.extend({},e),o);(i||pe._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=pe.timers,a=pe._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&At.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||pe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=pe._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=pe.timers,a=r?r.length:0;for(n.finish=!0,pe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),pe.each(["toggle","show","hide"],function(e,t){var n=pe.fn[t];pe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(P(t,!0),e,r,i)}}),pe.each({slideDown:P("show"),slideUp:P("hide"),slideToggle:P("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){pe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),pe.timers=[],pe.fx.tick=function(){var e,t=pe.timers,n=0;for(Nt=pe.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||pe.fx.stop(),Nt=void 0},pe.fx.timer=function(e){pe.timers.push(e),e()?pe.fx.start():pe.timers.pop()},pe.fx.interval=13,pe.fx.start=function(){kt||(kt=e.setInterval(pe.fx.tick,pe.fx.interval))},pe.fx.stop=function(){e.clearInterval(kt),kt=null},pe.fx.speeds={slow:600,fast:200,_default:400},pe.fn.delay=function(t,n){return t=pe.fx?pe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e,t=re.createElement("input"),n=re.createElement("div"),r=re.createElement("select"),i=r.appendChild(re.createElement("option"));n=re.createElement("div"),n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u<s;u++)if(n=r[u],(n.selected||u===i)&&(fe.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!pe.nodeName(n.parentNode,"optgroup"))){if(t=pe(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=pe.makeArray(t),a=i.length;a--;)if(r=i[a],pe.inArray(pe.valHooks.option.get(r),o)>-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("<div>").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.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)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){e("jquery",pe)}),pe});layui.define("jquery",function(i){"use strict";var a=layui.jquery,t=(layui.hint(),layui.device()),l="element",e="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(i){var t=this;return a.extend(!0,t.config,i),t},s.prototype.on=function(i,a){return layui.onevent(l,i,a)},s.prototype.tabAdd=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=e.children(".layui-tab-content");return n.append('<li lay-id="'+(t.id||"")+'">'+(t.title||"unnaming")+"</li>"),s.append('<div class="layui-tab-item">'+(t.content||"")+"</div>"),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return f.tabClick(null,null,s),this},s.prototype.progress=function(i,t){var l="layui-progress",e=a("."+l+"[lay-filter="+i+"]"),n=e.find("."+l+"-bar"),s=n.find("."+l+"-text");return n.css("width",t),s.text(t),this};var o=".layui-nav",c="layui-nav-item",r="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",h="layui-nav-more",y="layui-anim layui-anim-upbit",f={tabClick:function(i,t,s){var o=s||a(this),t=t||o.parent().children("li").index(o),c=o.parents(".layui-tab").eq(0),r=c.children(".layui-tab-content").children(".layui-tab-item"),u=c.attr("lay-filter");o.addClass(e).siblings().removeClass(e),r.eq(t).addClass(n).siblings().removeClass(n),layui.event.call(this,l,"tab("+u+")",{elem:c,index:t})},tabDelete:function(i,t){var l=t||a(this).parent(),n=l.index(),s=l.parents(".layui-tab").eq(0),o=s.children(".layui-tab-content").children(".layui-tab-item");l.hasClass(e)&&(l.next()[0]?f.tabClick.call(l.next()[0],null,n+1):l.prev()[0]&&f.tabClick.call(l.prev()[0],null,n-1)),l.remove(),o.eq(n).remove(),setTimeout(function(){f.tabAuto()},50)},tabAuto:function(){var i="layui-tab-more",l="layui-tab-bar",e="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),c=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),r=a('<span class="layui-unselect layui-tab-bar" '+c+"><i "+c+' class="layui-icon"></i></span>');if(n===window&&8!=t.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var i=a(this);if(!i.find("."+e)[0]){var t=a('<i class="layui-icon layui-unselect '+e+'">ဆ</i>');t.on("click",f.tabDelete),i.append(t)}}),o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+l)[0])return;o.append(r),s.attr("overflow",""),r.on("click",function(a){o[this.title?"removeClass":"addClass"](i),this.title=this.title?"":"收缩"})}else o.find("."+l).remove(),s.removeAttr("overflow")})},hideTabMore:function(i){var t=a(".layui-tab-title");i!==!0&&"tabmore"===a(i.target).attr("lay-stope")||(t.removeClass("layui-tab-more"),t.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter");i.find("."+d)[0]||(t.find("."+e).removeClass(e),i.addClass(e),layui.event.call(this,l,"nav("+n+")",i))},clickChild:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter");t.find("."+e).removeClass(e),i.addClass(e),layui.event.call(this,l,"nav("+n+")",i)},showChild:function(){var i=a(this),t=i.parents(o),l=i.parent(),e=i.siblings("."+d);t.hasClass(u)&&(e.removeClass(y),l["none"===e.css("display")?"addClass":"removeClass"](c+"ed"))},collapse:function(){var i=a(this),t=i.find(".layui-colla-icon"),e=i.siblings(".layui-colla-content"),s=i.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),c="none"===e.css("display");if("string"==typeof s.attr("lay-accordion")){var r=s.children(".layui-colla-item").children("."+n);r.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),r.removeClass(n)}e[c?"addClass":"removeClass"](n),t.html(c?"":""),layui.event.call(this,l,"collapse("+o+")",{title:i,content:e,show:c})}};s.prototype.init=function(i){var l={tab:function(){f.tabAuto.call({})},nav:function(){var i,l,e,s=200,p=function(o,c){var r=a(this),f=r.find("."+d);c.hasClass(u)?o.css({top:r.position().top,height:r.children("a").height(),opacity:1}):(f.addClass(y),o.css({left:r.position().left+parseFloat(r.css("marginLeft")),top:r.position().top+r.height()-5}),i=setTimeout(function(){o.css({width:r.width(),opacity:1})},t.ie&&t.ie<10?0:s),clearTimeout(e),"block"===f.css("display")&&clearTimeout(l),l=setTimeout(function(){f.addClass(n),r.find("."+h).addClass(h+"d")},300))};a(o).each(function(){var t=a(this),o=a('<span class="'+r+'"></span>'),y=t.find("."+c);t.find("."+r)[0]||(t.append(o),y.on("mouseenter",function(){p.call(this,o,t)}).on("mouseleave",function(){t.hasClass(u)||(clearTimeout(l),l=setTimeout(function(){t.find("."+d).removeClass(n),t.find("."+h).removeClass(h+"d")},300))}),t.on("mouseleave",function(){clearTimeout(i),e=setTimeout(function(){t.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},s)})),y.each(function(){var i=a(this),t=i.find("."+d);if(t[0]&&!i.find("."+h)[0]){var l=i.children("a");l.append('<span class="'+h+'"></span>')}i.off("click",f.clickThis).on("click",f.clickThis),i.children("a").off("click",f.showChild).on("click",f.showChild),t.children("dd").off("click",f.clickChild).on("click",f.clickChild)})})},breadcrumb:function(){var i=".layui-breadcrumb";a(i).each(function(){var i=a(this),t=i.attr("lay-separator")||">",l=i.find("a");l.find(".layui-box")[0]||(l.each(function(i){i!==l.length-1&&a(this).append('<span class="layui-box">'+t+"</span>")}),i.css("visibility","visible"))})},progress:function(){var i="layui-progress";a("."+i).each(function(){var t=a(this),l=t.find(".layui-progress-bar"),e=l.attr("lay-percent");l.css("width",e),t.attr("lay-showPercent")&&setTimeout(function(){var a=Math.round(l.width()/t.width()*100);a>100&&(a=100),l.html('<span class="'+i+'-text">'+a+"%</span>")},350)})},collapse:function(){var i="layui-collapse";a("."+i).each(function(){var i=a(this).find(".layui-colla-item");i.each(function(){var i=a(this),t=i.find(".layui-colla-title"),l=i.find(".layui-colla-content"),e="none"===l.css("display");t.find(".layui-colla-icon").remove(),t.append('<i class="layui-icon layui-colla-icon">'+(e?"":"")+"</i>"),t.off("click",f.collapse).on("click",f.collapse)})})}};return layui.each(l,function(i,a){a()})};var p=new s,v=a(document);p.init();var b=".layui-tab-title li";v.on("click",b,f.tabClick),v.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),i(l,function(i){return p.set(i)})});layui.define("layer",function(e){"use strict";var a=layui.jquery,t=layui.layer,i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"},s=function(e){this.options=e};s.prototype.init=function(){var e=this,t=e.options,r=a("body"),s=a(t.elem||".layui-upload-file"),u=a('<iframe id="'+n+'" class="'+n+'" name="'+n+'"></iframe>');return a("#"+n)[0]||r.append(u),s.each(function(r,s){s=a(s);var u='<form target="'+n+'" method="'+(t.method||"post")+'" key="set-mine" enctype="multipart/form-data" action="'+(t.url||"")+'"></form>',l=s.attr("lay-type")||t.type;t.unwrap||(u='<div class="layui-box layui-upload-button">'+u+'<span class="layui-upload-icon"><i class="layui-icon"></i>'+(s.attr("lay-title")||t.title||"上传"+(o[l]||"图片"))+"</span></div>"),u=a(u),t.unwrap||u.on("dragover",function(e){e.preventDefault(),a(this).addClass(i)}).on("dragleave",function(){a(this).removeClass(i)}).on("drop",function(){a(this).removeClass(i)}),s.parent("form").attr("target")===n&&(t.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=a(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return t.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return t.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return t.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return t.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=a("#"+n),f=setInterval(function(){var a;try{a=c.contents().find("body").text()}catch(i){t.msg("上传接口存在跨域",r),clearInterval(f)}if(a){clearInterval(f),c.contents().find("body").html("");try{a=JSON.parse(a)}catch(i){return a={},t.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(a,e)}},30);e.value=""}},e("upload",function(e){var a=new s(e=e||{});a.init()})});layui.define("layer",function(e){"use strict";var i=layui.jquery,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:[/^\d+$/,"只能填写数字"],date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent(l,e,i)},u.prototype.render=function(e){var t=this,n={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",u="layui-select-none",d="",f=i(r).find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed"),e&&d&&e.val(d)),e=null},v=function(t,r,f){var v=i(this),h=t.find("."+n),p=h.find("input"),m=t.find("dl"),k=m.children("dd");if(!r){var b=function(){t.addClass(a+"ed"),k.removeClass(o)},x=function(){t.removeClass(a+"ed"),p.blur(),g(p.val(),function(e){e&&(d=m.find("."+s).html(),p&&p.val(d))})};h.on("click",function(e){t.hasClass(a+"ed")?x():(y(e,!0),b()),m.find("."+u).remove()}),h.find(".layui-edge").on("click",function(){p.focus()}),p.on("keyup",function(e){var i=e.keyCode;9===i&&b()}).on("keydown",function(e){var i=e.keyCode;9===i?x():13===i&&e.preventDefault()});var g=function(e,t,a){var n=0;layui.each(k,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&t[r?"addClass":"removeClass"](o)});var l=n===k.length;return t(l),l},C=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&(g(i,function(e){e?m.find("."+u)[0]||m.append('<p class="'+u+'">无匹配项</p>'):m.find("."+u).remove()},"keyup"),void(""===i&&m.find("."+u).remove()))};f&&p.on("keyup",C).on("blur",function(i){e=p,d=m.find("."+s).html(),setTimeout(function(){g(p.val(),function(e){e&&!d&&p.val("")},"blur")},200)}),k.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=v.attr("lay-filter");return!e.hasClass(c)&&(v.val(a).removeClass("layui-form-danger"),p.val(e.text()),e.addClass(s).siblings().removeClass(s),layui.event.call(this,l,"select("+n+")",{elem:v[0],value:a,othis:t}),x(),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",y).on("click",y)}};f.each(function(e,l){var r=i(this),o=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]);if("string"==typeof r.attr("lay-ignore"))return r.show();var y="string"==typeof r.attr("lay-search"),h=i(['<div class="layui-unselect '+a+(u?" layui-select-disabled":"")+'">','<div class="'+n+'"><input type="text" placeholder="'+(l.options[0].innerHTML?l.options[0].innerHTML:t)+'" value="'+(d?f.html():"")+'" '+(y?"":"readonly")+' class="layui-input layui-unselect'+(u?" "+c:"")+'">','<i class="layui-edge"></i></div>','<dl class="layui-anim layui-anim-upbit'+(r.find("optgroup")[0]?" layui-select-group":"")+'">'+function(e){var i=[];return layui.each(e,function(e,t){(0!==e||t.value)&&("optgroup"===t.tagName.toLowerCase()?i.push("<dt>"+t.label+"</dt>"):i.push('<dd lay-value="'+t.value+'" class="'+(d===t.value?s:"")+(t.disabled?" "+c:"")+'">'+t.innerHTML+"</dd>"))}),i.join("")}(r.find("*"))+"</dl>","</div>"].join(""));o[0]&&o.remove(),r.after(h),v.call(this,h,u,y)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=i(r).find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=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=i(['<div class="layui-unselect '+u[0]+(n.checked?" "+u[1]:"")+(o?" layui-checkbox-disbaled "+c:"")+'" lay-skin="'+(r||"")+'">',{_switch:"<em>"+((n.checked?s[0]:s[1])||"")+"</em><i></i>"}[r]||(n.title.replace(/\s/g,"")?"<span>"+n.title+"</span>":"")+'<i class="layui-icon">'+(r?"":"")+"</i>","</div>"].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=i(r).find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[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=i(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();var u=i(['<div class="layui-unselect '+e+(l.checked?" "+e+"ed":"")+(o?" layui-radio-disbaled "+c:"")+'">','<i class="layui-anim layui-icon">'+t[l.checked?0:1]+"</i>","<span>"+(l.title||"未命名")+"</span>","</div>"].join(""));s[0]&&s.remove(),r.after(u),n.call(this,u)})}};return e?n[e]?n[e]():a.error("不支持的"+e+"表单渲染"):layui.each(n,function(e,i){i()}),t};var d=function(){var e=i(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),y=e.parents("form")[0],v=u.find("input,select,textarea"),h=e.attr("lay-filter");return layui.each(d,function(e,l){var r=i(this),c=r.attr("lay-verify").split("|"),u="",d=r.val();if(r.removeClass(o),layui.each(c,function(e,i){var c="function"==typeof a[i];if(a[i]&&(c?u=a[i](d,l):!a[i][0].test(d)))return t.msg(u||a[i][1],{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}),s)return s}),!s&&(layui.each(v,function(e,i){i.name&&(/^checkbox|radio$/.test(i.type)&&!i.checked||(c[i.name]=i.value))}),layui.event.call(this,l,"submit("+h+")",{elem:this,form:y,field:c}))},f=new u,y=i(document);f.render(),y.on("reset",r,function(){setTimeout(function(){f.render()},50)}),y.on("submit",r,d).on("click","*[lay-submit]",d),e(l,function(e){return f.set(e)})});layui.define("jquery",function(e){"use strict";var o=layui.jquery,a=layui.hint(),r="layui-tree-enter",i=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};i.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},i.prototype.tree=function(e,a){var r=this,i=r.options,n=a||i.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('<ul class="'+(n.spread?"layui-show":"")+'"></ul>'),s=o(["<li "+(n.spread?'data-spread="'+n.spread+'"':"")+">",function(){return l?'<i class="layui-icon layui-tree-spread">'+(n.spread?t.arrow[1]:t.arrow[0])+"</i>":""}(),function(){return i.check?'<i class="layui-icon layui-tree-check">'+("checkbox"===i.check?t.checkbox[0]:"radio"===i.check?t.radio[0]:"")+"</i>":""}(),function(){return'<a href="'+(n.href||"javascript:;")+'" '+(i.target&&n.href?'target="'+i.target+'"':"")+">"+('<i class="layui-icon layui-tree-'+(l?"branch":"leaf")+'">'+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"</i>")+("<cite>"+(n.name||"未命名")+"</cite></a>")}(),"</li>"].join(""));l&&(s.append(c),r.tree(c,n.children)),e.append(s),"function"==typeof i.click&&r.click(s,n),r.spread(s,n),i.drag&&r.drag(s,n)})},i.prototype.click=function(e,o){var a=this,r=a.options;e.children("a").on("click",function(e){layui.stope(e),r.click(o)})},i.prototype.spread=function(e,o){var a=this,r=(a.options,e.children(".layui-tree-spread")),i=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),i.removeClass("layui-show"),r.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),i.addClass("layui-show"),r.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};i[0]&&(r.on("click",l),n.on("dblclick",l))},i.prototype.on=function(e){var a=this,i=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),i.drag&&o(document).on("mousemove",function(e){var r=a.move;if(r.from){var i=(r.to,o('<div class="layui-box '+t+'"></div>'));e.preventDefault(),o("."+t)[0]||o("body").append(i);var n=o("."+t)[0]?o("."+t):i;n.addClass("layui-show").html(r.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(r),e.to&&e.to.elem.children("a").removeClass(r),a.move={},o("."+t).remove())})},i.prototype.move={},i.prototype.drag=function(e,a){var i=this,t=(i.options,e.children("a")),n=function(){var t=o(this),n=i.move;n.from&&(n.to={item:a,elem:e},t.addClass(r))};t.on("mousedown",function(){var o=i.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=i.move;a.from&&(delete a.to,e.removeClass(r))})},e("tree",function(e){var r=new i(e=e||{}),t=o(e.elem);return t[0]?void r.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define("jquery",function(l){"use strict";var o=layui.jquery,i={fixbar:function(l){l=l||{},l.bgcolor=l.bgcolor?"background-color:"+l.bgcolor:"";var i,a,c="layui-fixbar-top",t=[l.bar1===!0?"":l.bar1,l.bar2===!0?"":l.bar2,""],r=o(['<ul class="layui-fixbar">',l.bar1?'<li class="layui-icon" lay-type="bar1" style="'+l.bgcolor+'">'+t[0]+"</li>":"",l.bar2?'<li class="layui-icon" lay-type="bar2" style="'+l.bgcolor+'">'+t[1]+"</li>":"",'<li class="layui-icon '+c+'" lay-type="top" style="'+l.bgcolor+'">'+t[2]+"</li>","</ul>"].join("")),e=r.find("."+c),s=function(){var i=o(document).scrollTop();i>=(l.showHeight||200)?a||(e.show(),a=1):a&&(e.hide(),a=0)};o(".layui-fixbar")[0]||("object"==typeof l.css&&r.css(l.css),o("body").append(r),s(),r.find("li").on("click",function(){var i=o(this),a=i.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),l.click&&l.click.call(this,a)}),o(document).on("scroll",function(){i&&clearTimeout(i),i=setTimeout(function(){s()},100)}))}};l("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.jquery,o=function(e){},t='<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon "></i>';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var u=l(e.elem);if(u[0]){var f=l(e.scrollElem||document),m=e.mb||50,s=!("isAuto"in e)||e.isAuto,y=e.end||"没有更多了",v=e.scrollElem&&e.scrollElem!==document,d="<cite>加载更多</cite>",h=l('<div class="layui-flow-more"><a href="javascript:;">'+d+"</a></div>");u.find(".layui-flow-more")[0]||u.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||(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=m&&(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("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]&&u(l),i++})}},u=function(e,o){var u=a?(o||n).height():l(window).height(),f=n.scrollTop(),m=f+u;if(t.lazyimg.elem=l(r),e)c(e,u);else for(var s=0;s<t.lazyimg.elem.length;s++){var y=t.lazyimg.elem.eq(s),v=a?function(){return y.offset().top-n.offset().top+f}():y.offset().top;if(c(y,u),i=s,v>m)break}};if(u(),!o){var f;n.on("scroll",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){u(null,e)},50)}),o=!0}return u},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.jquery,i=layui.layer,a=layui.form(),l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",s=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};s.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},s.prototype.on=function(t,e){return layui.onevent(n,t,e)},s.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",s=e("#"+t),u="LAY_layedit_"+ ++a.index,d=s.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(['<div class="'+r+'">','<div class="layui-unselect layui-layedit-tool">'+f+"</div>",'<div class="layui-layedit-iframe">','<iframe id="'+u+'" name="'+u+'" textarea="'+t+'" frameborder="0"></iframe>',"</div>","</div>"].join(""));return l.ie&&l.ie<8?s.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),c.call(a,m,s[0],y),s.addClass("layui-hide").after(m),a.index)},s.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},s.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},s.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))}},s.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 c=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"),s=o.find("head"),c=e(["<style>","*{margin: 0; padding: 0;}","body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}","a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}","p{margin-bottom: 10px;}","img{display: inline-block; border: none; vertical-align: middle;}","pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}","</style>"].join("")),u=o.find("body");s.append(c),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,s=e(r.body);s.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("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"<p>")}}),e(n).parents("form").on("submit",function(){var t=s.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),s.on("paste",function(e){r.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){f.call(t,s),n.value=s.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),s={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({url:r.url,method:r.type,elem:e(n).find("input")[0],unwrap:!0,success: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||"上传失败")}})})},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:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},c=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,"<p>"),setTimeout(function(){o.focus()},10)):s[a]&&s[a].call(this,u),h.call(t,c,i)}},d=/image/;c.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,c),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:"超链接",skin:"layui-layer-msg",content:['<ul class="layui-form" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">URL</label>','<div class="layui-input-block" style="margin-left: 90px">','<input name="url" lay-verify="url" value="'+(t.href||"")+'" autofocus="true" autocomplete="off" class="layui-input">',"</div>","</li>",'<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">打开方式</label>','<div class="layui-input-block" style="margin-left: 90px">','<input type="radio" name="target" value="_self" class="layui-input" title="当前窗口"'+("_self"!==t.target&&t.target?"":"checked")+">",'<input type="radio" name="target" value="_blank" class="layui-input" title="新窗口" '+("_blank"===t.target?"checked":"")+">","</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],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('<li title="'+e+'"><img src="'+i+'" alt="'+e+'"></li>')}),'<ul class="layui-clear">'+t.join("")+"</ul>"}(),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:"插入代码",skin:"layui-layer-msg",content:['<ul class="layui-form layui-form-pane" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label">请选择语言</label>','<div class="layui-input-block">','<select name="lang">','<option value="JavaScript">JavaScript</option>','<option value="HTML">HTML</option>','<option value="CSS">CSS</option>','<option value="Java">Java</option>','<option value="PHP">PHP</option>','<option value="C#">C#</option>','<option value="Python">Python</option>','<option value="Ruby">Ruby</option>','<option value="Go">Go</option>',"</select>","</div>","</li>",'<li class="layui-form-item layui-form-text">','<label class="layui-form-label">代码</label>','<div class="layui-input-block">','<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>',"</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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:'<i class="layui-icon layedit-tool-html" title="HTML源代码" lay-command="html" layedit-event="html""></i><span class="layedit-tool-mid"></span>',strong:'<i class="layui-icon layedit-tool-b" title="加粗" lay-command="Bold" layedit-event="b""></i>',italic:'<i class="layui-icon layedit-tool-i" title="斜体" lay-command="italic" layedit-event="i""></i>',underline:'<i class="layui-icon layedit-tool-u" title="下划线" lay-command="underline" layedit-event="u""></i>',del:'<i class="layui-icon layedit-tool-d" title="删除线" lay-command="strikeThrough" layedit-event="d""></i>',"|":'<span class="layedit-tool-mid"></span>',left:'<i class="layui-icon layedit-tool-left" title="左对齐" lay-command="justifyLeft" layedit-event="left""></i>',center:'<i class="layui-icon layedit-tool-center" title="居中对齐" lay-command="justifyCenter" layedit-event="center""></i>',right:'<i class="layui-icon layedit-tool-right" title="右对齐" lay-command="justifyRight" layedit-event="right""></i>',link:'<i class="layui-icon layedit-tool-link" title="插入链接" layedit-event="link""></i>',unlink:'<i class="layui-icon layedit-tool-unlink layui-disabled" title="清除链接" lay-command="unlink" layedit-event="unlink""></i>',face:'<i class="layui-icon layedit-tool-face" title="表情" layedit-event="face""></i>',image:'<i class="layui-icon layedit-tool-image" title="图片" layedit-event="image"><input type="file" name="file"></i>',code:'<i class="layui-icon layedit-tool-code" title="插入代码" layedit-event="code"></i>',help:'<i class="layui-icon layedit-tool-help" title="帮助" layedit-event="help"></i>'},w=new s;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.jquery,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('<ol class="layui-code-ol"><li>'+o.replace(/[\r\t\n]+/g,"</li><li>")+"</li></ol>"),c.find(">.layui-code-h3")[0]||c.prepend('<h3 class="layui-code-h3">'+(c.attr("lay-title")||e.title||"code")+(e.about?'<a href="'+l+'" target="_blank">layui.code</a>':"")+"</h3>");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/Public/layui/lay/modules/code.js b/Public/layui/lay/modules/code.js new file mode 100644 index 0000000..1e41610 --- /dev/null +++ b/Public/layui/lay/modules/code.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('<ol class="layui-code-ol"><li>'+o.replace(/[\r\t\n]+/g,"</li><li>")+"</li></ol>"),c.find(">.layui-code-h3")[0]||c.prepend('<h3 class="layui-code-h3">'+(c.attr("lay-title")||e.title||"code")+(e.about?'<a href="'+l+'" target="_blank">layui.code</a>':"")+"</h3>");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/Public/layui/lay/modules/element.js b/Public/layui/lay/modules/element.js new file mode 100644 index 0000000..e724324 --- /dev/null +++ b/Public/layui/lay/modules/element.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define("jquery",function(i){"use strict";var a=layui.jquery,t=(layui.hint(),layui.device()),l="element",e="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(i){var t=this;return a.extend(!0,t.config,i),t},s.prototype.on=function(i,a){return layui.onevent(l,i,a)},s.prototype.tabAdd=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=e.children(".layui-tab-content");return n.append('<li lay-id="'+(t.id||"")+'">'+(t.title||"unnaming")+"</li>"),s.append('<div class="layui-tab-item">'+(t.content||"")+"</div>"),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return f.tabClick(null,null,s),this},s.prototype.progress=function(i,t){var l="layui-progress",e=a("."+l+"[lay-filter="+i+"]"),n=e.find("."+l+"-bar"),s=n.find("."+l+"-text");return n.css("width",t),s.text(t),this};var o=".layui-nav",c="layui-nav-item",r="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",h="layui-nav-more",y="layui-anim layui-anim-upbit",f={tabClick:function(i,t,s){var o=s||a(this),t=t||o.parent().children("li").index(o),c=o.parents(".layui-tab").eq(0),r=c.children(".layui-tab-content").children(".layui-tab-item"),u=c.attr("lay-filter");o.addClass(e).siblings().removeClass(e),r.eq(t).addClass(n).siblings().removeClass(n),layui.event.call(this,l,"tab("+u+")",{elem:c,index:t})},tabDelete:function(i,t){var l=t||a(this).parent(),n=l.index(),s=l.parents(".layui-tab").eq(0),o=s.children(".layui-tab-content").children(".layui-tab-item");l.hasClass(e)&&(l.next()[0]?f.tabClick.call(l.next()[0],null,n+1):l.prev()[0]&&f.tabClick.call(l.prev()[0],null,n-1)),l.remove(),o.eq(n).remove(),setTimeout(function(){f.tabAuto()},50)},tabAuto:function(){var i="layui-tab-more",l="layui-tab-bar",e="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),c=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),r=a('<span class="layui-unselect layui-tab-bar" '+c+"><i "+c+' class="layui-icon"></i></span>');if(n===window&&8!=t.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var i=a(this);if(!i.find("."+e)[0]){var t=a('<i class="layui-icon layui-unselect '+e+'">ဆ</i>');t.on("click",f.tabDelete),i.append(t)}}),o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+l)[0])return;o.append(r),s.attr("overflow",""),r.on("click",function(a){o[this.title?"removeClass":"addClass"](i),this.title=this.title?"":"收缩"})}else o.find("."+l).remove(),s.removeAttr("overflow")})},hideTabMore:function(i){var t=a(".layui-tab-title");i!==!0&&"tabmore"===a(i.target).attr("lay-stope")||(t.removeClass("layui-tab-more"),t.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter");i.find("."+d)[0]||(t.find("."+e).removeClass(e),i.addClass(e),layui.event.call(this,l,"nav("+n+")",i))},clickChild:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter");t.find("."+e).removeClass(e),i.addClass(e),layui.event.call(this,l,"nav("+n+")",i)},showChild:function(){var i=a(this),t=i.parents(o),l=i.parent(),e=i.siblings("."+d);t.hasClass(u)&&(e.removeClass(y),l["none"===e.css("display")?"addClass":"removeClass"](c+"ed"))},collapse:function(){var i=a(this),t=i.find(".layui-colla-icon"),e=i.siblings(".layui-colla-content"),s=i.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),c="none"===e.css("display");if("string"==typeof s.attr("lay-accordion")){var r=s.children(".layui-colla-item").children("."+n);r.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),r.removeClass(n)}e[c?"addClass":"removeClass"](n),t.html(c?"":""),layui.event.call(this,l,"collapse("+o+")",{title:i,content:e,show:c})}};s.prototype.init=function(i){var l={tab:function(){f.tabAuto.call({})},nav:function(){var i,l,e,s=200,p=function(o,c){var r=a(this),f=r.find("."+d);c.hasClass(u)?o.css({top:r.position().top,height:r.children("a").height(),opacity:1}):(f.addClass(y),o.css({left:r.position().left+parseFloat(r.css("marginLeft")),top:r.position().top+r.height()-5}),i=setTimeout(function(){o.css({width:r.width(),opacity:1})},t.ie&&t.ie<10?0:s),clearTimeout(e),"block"===f.css("display")&&clearTimeout(l),l=setTimeout(function(){f.addClass(n),r.find("."+h).addClass(h+"d")},300))};a(o).each(function(){var t=a(this),o=a('<span class="'+r+'"></span>'),y=t.find("."+c);t.find("."+r)[0]||(t.append(o),y.on("mouseenter",function(){p.call(this,o,t)}).on("mouseleave",function(){t.hasClass(u)||(clearTimeout(l),l=setTimeout(function(){t.find("."+d).removeClass(n),t.find("."+h).removeClass(h+"d")},300))}),t.on("mouseleave",function(){clearTimeout(i),e=setTimeout(function(){t.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},s)})),y.each(function(){var i=a(this),t=i.find("."+d);if(t[0]&&!i.find("."+h)[0]){var l=i.children("a");l.append('<span class="'+h+'"></span>')}i.off("click",f.clickThis).on("click",f.clickThis),i.children("a").off("click",f.showChild).on("click",f.showChild),t.children("dd").off("click",f.clickChild).on("click",f.clickChild)})})},breadcrumb:function(){var i=".layui-breadcrumb";a(i).each(function(){var i=a(this),t=i.attr("lay-separator")||">",l=i.find("a");l.find(".layui-box")[0]||(l.each(function(i){i!==l.length-1&&a(this).append('<span class="layui-box">'+t+"</span>")}),i.css("visibility","visible"))})},progress:function(){var i="layui-progress";a("."+i).each(function(){var t=a(this),l=t.find(".layui-progress-bar"),e=l.attr("lay-percent");l.css("width",e),t.attr("lay-showPercent")&&setTimeout(function(){var a=Math.round(l.width()/t.width()*100);a>100&&(a=100),l.html('<span class="'+i+'-text">'+a+"%</span>")},350)})},collapse:function(){var i="layui-collapse";a("."+i).each(function(){var i=a(this).find(".layui-colla-item");i.each(function(){var i=a(this),t=i.find(".layui-colla-title"),l=i.find(".layui-colla-content"),e="none"===l.css("display");t.find(".layui-colla-icon").remove(),t.append('<i class="layui-icon layui-colla-icon">'+(e?"":"")+"</i>"),t.off("click",f.collapse).on("click",f.collapse)})})}};return layui.each(l,function(i,a){a()})};var p=new s,v=a(document);p.init();var b=".layui-tab-title li";v.on("click",b,f.tabClick),v.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),i(l,function(i){return p.set(i)})}); \ No newline at end of file diff --git a/Public/layui/lay/modules/flow.js b/Public/layui/lay/modules/flow.js new file mode 100644 index 0000000..295d084 --- /dev/null +++ b/Public/layui/lay/modules/flow.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var l=layui.jquery,o=function(e){},t='<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon "></i>';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var u=l(e.elem);if(u[0]){var f=l(e.scrollElem||document),m=e.mb||50,s=!("isAuto"in e)||e.isAuto,y=e.end||"没有更多了",v=e.scrollElem&&e.scrollElem!==document,d="<cite>加载更多</cite>",h=l('<div class="layui-flow-more"><a href="javascript:;">'+d+"</a></div>");u.find(".layui-flow-more")[0]||u.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||(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=m&&(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("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]&&u(l),i++})}},u=function(e,o){var u=a?(o||n).height():l(window).height(),f=n.scrollTop(),m=f+u;if(t.lazyimg.elem=l(r),e)c(e,u);else for(var s=0;s<t.lazyimg.elem.length;s++){var y=t.lazyimg.elem.eq(s),v=a?function(){return y.offset().top-n.offset().top+f}():y.offset().top;if(c(y,u),i=s,v>m)break}};if(u(),!o){var f;n.on("scroll",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){u(null,e)},50)}),o=!0}return u},e("flow",new o)}); \ No newline at end of file diff --git a/Public/layui/lay/modules/form.js b/Public/layui/lay/modules/form.js new file mode 100644 index 0000000..a47339a --- /dev/null +++ b/Public/layui/lay/modules/form.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var i=layui.jquery,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:[/^\d+$/,"只能填写数字"],date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent(l,e,i)},u.prototype.render=function(e){var t=this,n={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",u="layui-select-none",d="",f=i(r).find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed"),e&&d&&e.val(d)),e=null},v=function(t,r,f){var v=i(this),h=t.find("."+n),p=h.find("input"),m=t.find("dl"),k=m.children("dd");if(!r){var b=function(){t.addClass(a+"ed"),k.removeClass(o)},x=function(){t.removeClass(a+"ed"),p.blur(),g(p.val(),function(e){e&&(d=m.find("."+s).html(),p&&p.val(d))})};h.on("click",function(e){t.hasClass(a+"ed")?x():(y(e,!0),b()),m.find("."+u).remove()}),h.find(".layui-edge").on("click",function(){p.focus()}),p.on("keyup",function(e){var i=e.keyCode;9===i&&b()}).on("keydown",function(e){var i=e.keyCode;9===i?x():13===i&&e.preventDefault()});var g=function(e,t,a){var n=0;layui.each(k,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&t[r?"addClass":"removeClass"](o)});var l=n===k.length;return t(l),l},C=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&(g(i,function(e){e?m.find("."+u)[0]||m.append('<p class="'+u+'">无匹配项</p>'):m.find("."+u).remove()},"keyup"),void(""===i&&m.find("."+u).remove()))};f&&p.on("keyup",C).on("blur",function(i){e=p,d=m.find("."+s).html(),setTimeout(function(){g(p.val(),function(e){e&&!d&&p.val("")},"blur")},200)}),k.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=v.attr("lay-filter");return!e.hasClass(c)&&(v.val(a).removeClass("layui-form-danger"),p.val(e.text()),e.addClass(s).siblings().removeClass(s),layui.event.call(this,l,"select("+n+")",{elem:v[0],value:a,othis:t}),x(),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",y).on("click",y)}};f.each(function(e,l){var r=i(this),o=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]);if("string"==typeof r.attr("lay-ignore"))return r.show();var y="string"==typeof r.attr("lay-search"),h=i(['<div class="layui-unselect '+a+(u?" layui-select-disabled":"")+'">','<div class="'+n+'"><input type="text" placeholder="'+(l.options[0].innerHTML?l.options[0].innerHTML:t)+'" value="'+(d?f.html():"")+'" '+(y?"":"readonly")+' class="layui-input layui-unselect'+(u?" "+c:"")+'">','<i class="layui-edge"></i></div>','<dl class="layui-anim layui-anim-upbit'+(r.find("optgroup")[0]?" layui-select-group":"")+'">'+function(e){var i=[];return layui.each(e,function(e,t){(0!==e||t.value)&&("optgroup"===t.tagName.toLowerCase()?i.push("<dt>"+t.label+"</dt>"):i.push('<dd lay-value="'+t.value+'" class="'+(d===t.value?s:"")+(t.disabled?" "+c:"")+'">'+t.innerHTML+"</dd>"))}),i.join("")}(r.find("*"))+"</dl>","</div>"].join(""));o[0]&&o.remove(),r.after(h),v.call(this,h,u,y)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=i(r).find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=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=i(['<div class="layui-unselect '+u[0]+(n.checked?" "+u[1]:"")+(o?" layui-checkbox-disbaled "+c:"")+'" lay-skin="'+(r||"")+'">',{_switch:"<em>"+((n.checked?s[0]:s[1])||"")+"</em><i></i>"}[r]||(n.title.replace(/\s/g,"")?"<span>"+n.title+"</span>":"")+'<i class="layui-icon">'+(r?"":"")+"</i>","</div>"].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=i(r).find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[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=i(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();var u=i(['<div class="layui-unselect '+e+(l.checked?" "+e+"ed":"")+(o?" layui-radio-disbaled "+c:"")+'">','<i class="layui-anim layui-icon">'+t[l.checked?0:1]+"</i>","<span>"+(l.title||"未命名")+"</span>","</div>"].join(""));s[0]&&s.remove(),r.after(u),n.call(this,u)})}};return e?n[e]?n[e]():a.error("不支持的"+e+"表单渲染"):layui.each(n,function(e,i){i()}),t};var d=function(){var e=i(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),y=e.parents("form")[0],v=u.find("input,select,textarea"),h=e.attr("lay-filter");return layui.each(d,function(e,l){var r=i(this),c=r.attr("lay-verify").split("|"),u="",d=r.val();if(r.removeClass(o),layui.each(c,function(e,i){var c="function"==typeof a[i];if(a[i]&&(c?u=a[i](d,l):!a[i][0].test(d)))return t.msg(u||a[i][1],{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}),s)return s}),!s&&(layui.each(v,function(e,i){i.name&&(/^checkbox|radio$/.test(i.type)&&!i.checked||(c[i.name]=i.value))}),layui.event.call(this,l,"submit("+h+")",{elem:this,form:y,field:c}))},f=new u,y=i(document);f.render(),y.on("reset",r,function(){setTimeout(function(){f.render()},50)}),y.on("submit",r,d).on("click","*[lay-submit]",d),e(l,function(e){return f.set(e)})}); \ No newline at end of file diff --git a/Public/layui/lay/modules/jquery.js b/Public/layui/lay/modules/jquery.js new file mode 100644 index 0000000..015155e --- /dev/null +++ b/Public/layui/lay/modules/jquery.js @@ -0,0 +1,5 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;!function(e,t){"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(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x<d;x++)if(a=e[x],a||0===a)if("object"===pe.type(a))pe.merge(v,a.nodeType?[a]:a);else if(Ue.test(a)){for(u=u||y.appendChild(t.createElement("div")),l=(We.exec(a)||["",""])[1].toLowerCase(),f=Xe[l]||Xe._default,u.innerHTML=f[1]+pe.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!fe.leadingWhitespace&&$e.test(a)&&v.push(t.createTextNode($e.exec(a)[0])),!fe.tbody)for(a="table"!==l||Ve.test(a)?"<table>"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r<i;r++)pe.event.add(t,n,s[n][r])}a.data&&(a.data=pe.extend({},a.data))}}function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!fe.noCloneEvent&&t[pe.expando]){i=pe._data(t);for(r in i.events)pe.removeEvent(t,r,i.handle);t.removeAttribute(pe.expando)}"script"===n&&t.text!==e.text?(C(t).text=e.text,E(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),fe.html5Clone&&e.innerHTML&&!pe.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Be.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}}function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-1,p=t[0],g=pe.isFunction(p);if(g||f>1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c<f;c++)o=l,c!==d&&(o=pe.clone(o,!0,!0),a&&pe.merge(s,h(o,"script"))),n.call(e[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,pe.map(s,E),c=0;c<a;c++)o=s[c],Ie.test(o.type||"")&&!pe._data(o,"globalEval")&&pe.contains(u,o)&&(o.src?pe._evalUrl&&pe._evalUrl(o.src):pe.globalEval((o.text||o.textContent||o.innerHTML||"").replace(ot,"")));l=i=null}return e}function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||pe.cleanData(h(r)),r.parentNode&&(n&&pe.contains(r.ownerDocument,r)&&g(h(r,"script")),r.parentNode.removeChild(r));return e}function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n[0],"display");return n.detach(),r}function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(ut||pe("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a<s;a++)r=e[a],r.style&&(o[a]=pe._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Re(r)&&(o[a]=pe._data(r,"olddisplay",j(r.nodeName)))):(i=Re(r),(n&&"none"!==n||!i)&&pe._data(r,"olddisplay",i?n:pe.css(r,"display"))));for(a=0;a<s;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function _(e,t,n){var r=bt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function F(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=pe.css(e,n+Oe[o],!0,i)),r?("content"===n&&(a-=pe.css(e,"padding"+Oe[o],!0,i)),"margin"!==n&&(a-=pe.css(e,"border"+Oe[o]+"Width",!0,i))):(a+=pe.css(e,"padding"+Oe[o],!0,i),"padding"!==n&&(a+=pe.css(e,"border"+Oe[o]+"Width",!0,i)));return a}function M(t,n,r){var i=!0,o="width"===n?t.offsetWidth:t.offsetHeight,a=ht(t),s=fe.boxSizing&&"border-box"===pe.css(t,"boxSizing",!1,a);if(re.msFullscreenElement&&e.top!==e&&t.getClientRects().length&&(o=Math.round(100*t.getBoundingClientRect()[n])),o<=0||null==o){if(o=gt(t,n,a),(o<0||null==o)&&(o=t.style[n]),ft.test(o))return o;i=s&&(fe.boxSizingReliable()||o===t.style[n]),o=parseFloat(o)||0}return o+F(t,n,r||(s?"border":"content"),i,a)+"px"}function O(e,t,n,r,i){return new O.prototype.init(e,t,n,r,i)}function R(){return e.setTimeout(function(){Nt=void 0}),Nt=pe.now()}function P(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)n=Oe[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function B(e,t,n){for(var r,i=($.tweeners[t]||[]).concat($.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function W(e,t,n){var r,i,o,a,s,u,l,c,f=this,d={},p=e.style,h=e.nodeType&&Re(e),g=pe._data(e,"fxshow");n.queue||(s=pe._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,f.always(function(){f.always(function(){s.unqueued--,pe.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],l=pe.css(e,"display"),c="none"===l?pe._data(e,"olddisplay")||j(e.nodeName):l,"inline"===c&&"none"===pe.css(e,"float")&&(fe.inlineBlockNeedsLayout&&"inline"!==j(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",fe.shrinkWrapBlocks()||f.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],St.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}d[r]=g&&g[r]||pe.style(e,r)}else l=void 0;if(pe.isEmptyObject(d))"inline"===("none"===l?j(e.nodeName):l)&&(p.display=l);else{g?"hidden"in g&&(h=g.hidden):g=pe._data(e,"fxshow",{}),o&&(g.hidden=!h),h?pe(e).show():f.done(function(){pe(e).hide()}),f.done(function(){var t;pe._removeData(e,"fxshow");for(t in d)pe.style(e,t,d[t])});for(r in d)a=B(h?g[r]:0,r,f),r in g||(g[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function I(e,t){var n,r,i,o,a;for(n in e)if(r=pe.camelCase(n),i=t[r],o=e[n],pe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=pe.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function $(e,t,n){var r,i,o=0,a=$.prefilters.length,s=pe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Nt||R(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),o<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:pe.extend({},t),opts:pe.extend(!0,{specialEasing:{},easing:pe.easing._default},n),originalProperties:t,originalOptions:n,startTime:Nt||R(),duration:n.duration,tweens:[],createTween:function(t,n){var r=pe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(I(c,l.opts.specialEasing);o<a;o++)if(r=$.prefilters[o].call(l,e,c,l.opts))return pe.isFunction(r.stop)&&(pe._queueHooks(l.elem,l.opts.queue).stop=pe.proxy(r.stop,r)),r;return pe.map(c,B,l),pe.isFunction(l.opts.start)&&l.opts.start.call(e,l),pe.fx.timer(pe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){return pe.attr(e,"class")||""}function X(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(De)||[];if(pe.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function U(e,t,n,r){function i(s){var u;return o[s]=!0,pe.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||a||o[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},a=e===Qt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function V(e,t){var n,r,i=pe.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&pe.extend(!0,e,n),e}function Y(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r||(r=a)}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}function J(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(a=l[u+" "+o]||l["* "+o],!a)for(i in l)if(s=i.split(" "),s[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){a===!0?a=l[i]:l[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function G(e){return e.style&&e.style.display||pe.css(e,"display")}function K(e){for(;e&&1===e.nodeType;){if("none"===G(e)||"hidden"===e.type)return!0;e=e.parentNode}return!1}function Q(e,t,n,r){var i;if(pe.isArray(t))pe.each(t,function(t,i){n||rn.test(e)?r(e,i):Q(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==pe.type(t))r(e,t);else for(i in t)Q(e+"["+i+"]",t[i],n,r)}function Z(){try{return new e.XMLHttpRequest}catch(t){}}function ee(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function te(e){return pe.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var ne=[],re=e.document,ie=ne.slice,oe=ne.concat,ae=ne.push,se=ne.indexOf,ue={},le=ue.toString,ce=ue.hasOwnProperty,fe={},de="1.12.3",pe=function(e,t){return new pe.fn.init(e,t)},he=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ge=/^-ms-/,me=/-([\da-z])/gi,ye=function(e,t){return t.toUpperCase()};pe.fn=pe.prototype={jquery:de,constructor:pe,selector:"",length:0,toArray:function(){return ie.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:ie.call(this)},pushStack:function(e){var t=pe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return pe.each(this,e)},map:function(e){return this.pushStack(pe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(ie.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ae,sort:ne.sort,splice:ne.splice},pe.extend=pe.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||pe.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(l&&n&&(pe.isPlainObject(n)||(t=pe.isArray(n)))?(t?(t=!1,o=e&&pe.isArray(e)?e:[]):o=e&&pe.isPlainObject(e)?e:{},a[r]=pe.extend(l,o,n)):void 0!==n&&(a[r]=n));return a},pe.extend({expando:"jQuery"+(de+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===pe.type(e)},isArray:Array.isArray||function(e){return"array"===pe.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!pe.isArray(e)&&t-parseFloat(t)+1>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(he,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?pe.merge(r,"string"==typeof e?[e]:e):ae.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(se)return se.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o,a=0,s=[];if(n(e))for(i=e.length;a<i;a++)o=t(e[a],a,r),null!=o&&s.push(o);else for(a in e)o=t(e[a],a,r),null!=o&&s.push(o);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(i=e[t],t=e,e=i),pe.isFunction(e))return n=ie.call(arguments,2),r=function(){return e.apply(t||this,n.concat(ie.call(arguments)))},r.guid=e.guid=e.guid||pe.guid++,r},now:function(){return+new Date},support:fe}),"function"==typeof Symbol&&(pe.fn[Symbol.iterator]=ne[Symbol.iterator]),pe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ue["[object "+t+"]"]=t.toLowerCase()});var ve=function(e){function t(e,t,n,r){var i,o,a,s,u,l,f,p,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:B)!==H&&L(t),t=t||H,_)){if(11!==g&&(l=ye.exec(e)))if(i=l[1]){if(9===g){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(h&&(a=h.getElementById(i))&&R(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return Q.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return Q.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!X[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,p=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(xe,"\\$&"):t.setAttribute("id",s=P),f=N(e),o=f.length,u=de.test(s)?"#"+s:"[id='"+s+"']";o--;)f[o]=u+" "+d(f[o]);p=f.join(","),h=ve.test(e)&&c(t.parentNode)||t}if(p)try{return Q.apply(n,h.querySelectorAll(p)),n}catch(m){}finally{s===P&&t.removeAttribute("id")}}}return S(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[P]||(t[P]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(s=u[r])&&s[0]===W&&s[1]===o)return c[2]=s[2];if(u[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i<o;i++)t(e,n[i],r);return r}function m(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function y(e,t,n,i,o,a){return i&&!i[P]&&(i=y(i)),o&&!o[P]&&(o=y(o,a)),r(function(r,a,s,u){var l,c,f,d=[],p=[],h=a.length,y=r||g(t||"*",s.nodeType?[s]:s,[]),v=!e||!r&&t?y:m(y,d,e,s,u),x=n?o||(r?e:h||i)?[]:a:v;if(n&&n(v,x,s,u),i)for(l=m(x,p),i(l,[],s,u),c=l.length;c--;)(f=l[c])&&(x[p[c]]=!(v[p[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(v[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):d[c])>-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s<i;s++)if(n=T.relative[e[s].type])c=[p(h(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;r<i&&!T.relative[e[r].type];r++);return y(s>1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s<r&&v(e.slice(s,r)),r<i&&v(e=e.slice(r)),r<i&&d(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",ae=new RegExp(ne+"+","g"),se=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="<a id='"+P+"'></a><select id='"+P+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(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(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=s(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,N=t.tokenize=function(e,n){var r,i,o,a,s,u,l,c=z[e+" "];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(i=ue.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),r=!1,(i=le.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(se," ")}),s=s.slice(r.length));for(a in T.filter)!(i=pe[a].exec(s))||l[a]&&!(i=l[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},k=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=N(e)),n=t.length;n--;)o=v(t[n]),o[P]?r.push(o):i.push(o);o=X(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,f=!r&&N(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t<i;t++)if(pe.contains(r[t],this))return!0}));for(t=0;t<i;t++)pe.find(e,r[t],n);return n=this.pushStack(i>1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(pe.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=we.test(e)||"string"!=typeof e?pe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u<a.length;)a[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=a.length,n=!1);e.memory||(n=!1),t=!1,i&&(a=n?[]:"")},c={add:function(){return a&&(n&&!t&&(u=a.length-1,s.push(n)),function r(t){pe.each(t,function(t,n){pe.isFunction(n)?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==pe.type(n)&&r(n)})}(arguments),n&&!t&&l()),this},remove:function(){return pe.each(arguments,function(e,t){for(var n;(n=pe.inArray(t,a,n))>-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i<a;i++)o[i]&&pe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--s;return s||u.resolveWith(r,o),u.promise()}});var je;pe.fn.ready=function(e){return pe.ready.promise().done(e),this},pe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?pe.readyWait++:pe.ready(!0)},ready:function(e){(e===!0?--pe.readyWait:pe.isReady)||(pe.isReady=!0,e!==!0&&--pe.readyWait>0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?pe.queue(this[0],e):void 0===t?this:this.each(function(){var n=pe.queue(this,e,t);pe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&pe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){pe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=pe.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=pe._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),function(){var e;fe.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return n=re.getElementsByTagName("body")[0],n&&n.style?(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(re.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var Fe=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Me=new RegExp("^(?:([+-])=|)("+Fe+")([a-z%]*)$","i"),Oe=["Top","Right","Bottom","Left"],Re=function(e,t){return e=t||e,"none"===pe.css(e,"display")||!pe.contains(e.ownerDocument,e)},Pe=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===pe.type(n)){i=!0;for(s in n)Pe(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,pe.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(pe(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},Be=/^(?:checkbox|radio)$/i,We=/<([\w:-]+)/,Ie=/^$|\/(?:java|ecma)script/i,$e=/^\s+/,ze="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";!function(){var e=re.createElement("div"),t=re.createDocumentFragment(),n=re.createElement("input");e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav></:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="<textarea>x</textarea>",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:fe.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/<tbody/i;!function(){var t,n,r=re.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(fe[t]=n in e)||(r.setAttribute(n,"t"),fe[t]=r.attributes[n].expando===!1);r=null}();var Ye=/^(?:input|select|textarea)$/i,Je=/^key/,Ge=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ke=/^(?:focusinfocus|focusoutblur)$/,Qe=/^([^.]*)(?:\.(.+)|)/;pe.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe._data(e);if(m){for(n.handler&&(u=n,n=u.handler,i=u.selector),n.guid||(n.guid=pe.guid++),(a=m.events)||(a=m.events={}),(c=m.handle)||(c=m.handle=function(e){return"undefined"==typeof pe||e&&pe.event.triggered===e.type?void 0:pe.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(De)||[""],s=t.length;s--;)o=Qe.exec(t[s])||[],p=g=o[1],h=(o[2]||"").split(".").sort(),p&&(l=pe.event.special[p]||{},p=(i?l.delegateType:l.bindType)||p,l=pe.event.special[p]||{},f=pe.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&pe.expr.match.needsContext.test(i),namespace:h.join(".")},u),(d=a[p])||(d=a[p]=[],d.delegateCount=0,l.setup&&l.setup.call(e,r,h,c)!==!1||(e.addEventListener?e.addEventListener(p,c,!1):e.attachEvent&&e.attachEvent("on"+p,c))),l.add&&(l.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,f):d.push(f),pe.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe.hasData(e)&&pe._data(e);if(m&&(c=m.events)){for(t=(t||"").match(De)||[""],l=t.length;l--;)if(s=Qe.exec(t[l])||[],p=g=s[1],h=(s[2]||"").split(".").sort(),p){for(f=pe.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=c[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||pe.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)pe.event.remove(e,p+t[l],n,r,!0);pe.isEmptyObject(c)&&(delete m.handle,pe._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,u,l,c,f,d=[r||re],p=ce.call(t,"type")?t.type:t,h=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=c=r=r||re,3!==r.nodeType&&8!==r.nodeType&&!Ke.test(p+pe.event.triggered)&&(p.indexOf(".")>-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n<s;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?pe(i,this).index(u)>-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[pe.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Ge.test(i)?this.mouseHooks:Je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new pe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||re),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||re,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==b()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===b()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(pe.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return pe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){var r=pe.extend(new pe.Event,n,{type:e,isSimulated:!0});pe.event.trigger(r,null,t),r.isDefaultPrevented()&&n.preventDefault()}},pe.removeEvent=re.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){var r="on"+t;e.detachEvent&&("undefined"==typeof e[r]&&(e[r]=null),e.detachEvent(r,n))},pe.Event=function(e,t){return this instanceof pe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?v:x):this.type=e,t&&pe.extend(this,t),this.timeStamp=e&&e.timeStamp||pe.now(),void(this[pe.expando]=!0)):new pe.Event(e,t)},pe.Event.prototype={constructor:pe.Event,isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=v,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=v,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=v,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},pe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){pe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||pe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),fe.submit||(pe.event.special.submit={setup:function(){return!pe.nodeName(this,"form")&&void pe.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=pe.nodeName(t,"input")||pe.nodeName(t,"button")?pe.prop(t,"form"):void 0;n&&!pe._data(n,"submit")&&(pe.event.add(n,"submit._submit",function(e){e._submitBubble=!0}),pe._data(n,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode&&!e.isTrigger&&pe.event.simulate("submit",this.parentNode,e))},teardown:function(){return!pe.nodeName(this,"form")&&void pe.event.remove(this,"._submit")}}),fe.change||(pe.event.special.change={setup:function(){return Ye.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(pe.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),pe.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),pe.event.simulate("change",this,e)})),!1):void pe.event.add(this,"beforeactivate._change",function(e){var t=e.target;Ye.test(t.nodeName)&&!pe._data(t,"change")&&(pe.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||pe.event.simulate("change",this.parentNode,e)}),pe._data(t,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return pe.event.remove(this,"._change"),!Ye.test(this.nodeName)}}),fe.focusin||pe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){pe.event.simulate(t,e.target,pe.event.fix(e))};pe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=pe._data(r,t);i||r.addEventListener(e,n,!0),pe._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=pe._data(r,t)-1;i?pe._data(r,t,i):(r.removeEventListener(e,n,!0),pe._removeData(r,t))}}}),pe.fn.extend({on:function(e,t,n,r){return w(this,e,t,n,r)},one:function(e,t,n,r){return w(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,pe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=x),this.each(function(){pe.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){pe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return pe.event.trigger(e,t,n,!0)}});var Ze=/ jQuery\d+="(?:null|\d+)"/g,et=new RegExp("<(?:"+ze+")[\\s/>]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/<script|<style|<link/i,rt=/checked\s*(?:[^=]|=\s*.checked.)/i,it=/^true\/(.*)/,ot=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(pe.cleanData(h(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return S(this,arguments,function(t){var n=this.parentNode;pe.inArray(this,e)<0&&(pe.cleanData(h(this)), +n&&n.replaceChild(t,this))},e)}}),pe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){pe.fn[e]=function(e){for(var n,r=0,i=[],o=pe(e),a=o.length-1;r<=a;r++)n=r===a?this:this.clone(!0),pe(o[r])[t](n),ae.apply(i,n.get());return this.pushStack(i)}});var ut,lt={HTML:"block",BODY:"block"},ct=/^margin/,ft=new RegExp("^("+Fe+")(?!px)[a-z%]+$","i"),dt=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i},pt=re.documentElement;!function(){function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=i=s=!1,r=a=!0,e.getComputedStyle&&(c=e.getComputedStyle(l),n="1%"!==(c||{}).top,s="2px"===(c||{}).marginLeft,i="4px"===(c||{width:"4px"}).width,l.style.marginRight="50%",r="4px"===(c||{marginRight:"4px"}).marginRight,t=l.appendChild(re.createElement("div")),t.style.cssText=l.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",l.style.width="1px",a=!parseFloat((e.getComputedStyle(t)||{}).marginRight),l.removeChild(t)),l.style.display="none",o=0===l.getClientRects().length,o&&(l.style.display="",l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a<i;a++)o[t[a]]=pe.css(e,t[a],!1,r);return o}return void 0!==n?pe.style(e,t,n):pe.css(e,t)},e,t,arguments.length>1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r<i;r++)n=e[r],$.tweeners[n]=$.tweeners[n]||[],$.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?$.prefilters.unshift(e):$.prefilters.push(e)}}),pe.speed=function(e,t,n){var r=e&&"object"==typeof e?pe.extend({},e):{complete:n||!n&&t||pe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!pe.isFunction(t)&&t};return r.duration=pe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in pe.fx.speeds?pe.fx.speeds[r.duration]:pe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){pe.isFunction(r.old)&&r.old.call(this),r.queue&&pe.dequeue(this,r.queue)},r},pe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Re).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=pe.isEmptyObject(e),o=pe.speed(t,n,r),a=function(){var t=$(this,pe.extend({},e),o);(i||pe._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=pe.timers,a=pe._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&At.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||pe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=pe._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=pe.timers,a=r?r.length:0;for(n.finish=!0,pe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),pe.each(["toggle","show","hide"],function(e,t){var n=pe.fn[t];pe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(P(t,!0),e,r,i)}}),pe.each({slideDown:P("show"),slideUp:P("hide"),slideToggle:P("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){pe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),pe.timers=[],pe.fx.tick=function(){var e,t=pe.timers,n=0;for(Nt=pe.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||pe.fx.stop(),Nt=void 0},pe.fx.timer=function(e){pe.timers.push(e),e()?pe.fx.start():pe.timers.pop()},pe.fx.interval=13,pe.fx.start=function(){kt||(kt=e.setInterval(pe.fx.tick,pe.fx.interval))},pe.fx.stop=function(){e.clearInterval(kt),kt=null},pe.fx.speeds={slow:600,fast:200,_default:400},pe.fn.delay=function(t,n){return t=pe.fx?pe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e,t=re.createElement("input"),n=re.createElement("div"),r=re.createElement("select"),i=r.appendChild(re.createElement("option"));n=re.createElement("div"),n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u<s;u++)if(n=r[u],(n.selected||u===i)&&(fe.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!pe.nodeName(n.parentNode,"optgroup"))){if(t=pe(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=pe.makeArray(t),a=i.length;a--;)if(r=i[a],pe.inArray(pe.valHooks.option.get(r),o)>-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("<div>").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.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)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){e("jquery",pe)}),pe}); \ No newline at end of file diff --git a/Public/layui/lay/modules/laydate.js b/Public/layui/lay/modules/laydate.js new file mode 100644 index 0000000..40b83f4 --- /dev/null +++ b/Public/layui/lay/modules/laydate.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define(function(e){"use strict";var t=window,a={path:"",skin:"default",format:"YYYY-MM-DD",min:"1900-01-01 00:00:00",max:"2099-12-31 23:59:59",isv:!1,init:!0},n={},s=document,i="createElement",o="getElementById",l="getElementsByTagName",d=["laydate_box","laydate_void","laydate_click","LayDateSkin","skins/","/laydate.css"];t.laydate=function(e){return e=e||{},n.run(e),laydate},laydate.v="1.1",n.trim=function(e){return e=e||"",e.replace(/^\s|\s$/g,"").replace(/\s+/g," ")},n.digit=function(e){return e<10?"0"+(0|e):e},n.stopmp=function(e){return e=e||t.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this},n.each=function(e,t){for(var a=0,n=e.length;a<n&&t(a,e[a])!==!1;a++);},n.hasClass=function(e,t){return e=e||{},new RegExp("\\b"+t+"\\b").test(e.className)},n.addClass=function(e,t){return e=e||{},n.hasClass(e,t)||(e.className+=" "+t),e.className=n.trim(e.className),this},n.removeClass=function(e,t){if(e=e||{},n.hasClass(e,t)){var a=new RegExp("\\b"+t+"\\b");e.className=e.className.replace(a,"")}return this},n.removeCssAttr=function(e,t){var a=e.style;a.removeProperty?a.removeProperty(t):a.removeAttribute(t)},n.shde=function(e,t){e.style.display=t?"none":"block"},n.query=function(e){if(e&&1===e.nodeType){if("input"!==e.tagName.toLowerCase())throw new Error("选择器elem错误");return e}var t,e=n.trim(e).split(" "),a=s[o](e[0].substr(1));if(a){if(e[1]){if(/^\./.test(e[1])){var i,d=e[1].substr(1),r=new RegExp("\\b"+d+"\\b");return t=[],i=s.getElementsByClassName?a.getElementsByClassName(d):a[l]("*"),n.each(i,function(e,a){r.test(a.className)&&t.push(a)}),t[0]?t:""}return t=a[l](e[1]),t[0]?a[l](e[1]):""}return a}},n.on=function(e,a,s){return e.attachEvent?e.attachEvent("on"+a,function(){s.call(e,t.even)}):e.addEventListener(a,s,!1),n},n.stopMosup=function(e,t){"mouseup"!==e&&n.on(t,"mouseup",function(e){n.stopmp(e)})},n.run=function(e){var t=(n.query,e.elem);t&&(d.elemv=/textarea|input/.test(t.tagName.toLocaleLowerCase())?"value":"innerHTML",("init"in e?e.init:a.init)&&!t[d.elemv]&&(t[d.elemv]=laydate.now(null,e.format||a.format)),n.view(t,e),n.reshow())},n.scroll=function(e){return e=e?"scrollLeft":"scrollTop",s.body[e]|s.documentElement[e]},n.winarea=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},n.isleap=function(e){return e%4===0&&e%100!==0||e%400===0},n.checkVoid=function(e,t,a){var s=[];return e=0|e,t=0|t,a=0|a,e<n.mins[0]?s=["y"]:e>n.maxs[0]?s=["y",1]:e>=n.mins[0]&&e<=n.maxs[0]&&(e==n.mins[0]&&(t<n.mins[1]?s=["m"]:t==n.mins[1]&&a<n.mins[2]&&(s=["d"])),e==n.maxs[0]&&(t>n.maxs[1]?s=["m",1]:t==n.maxs[1]&&a>n.maxs[2]&&(s=["d",1]))),s},n.timeVoid=function(e,t){if(n.ymd[1]+1==n.mins[1]&&n.ymd[2]==n.mins[2]){if(0===t&&e<n.mins[3])return 1;if(1===t&&e<n.mins[4])return 1;if(2===t&&e<n.mins[5])return 1}else if(n.ymd[1]+1==n.maxs[1]&&n.ymd[2]==n.maxs[2]){if(0===t&&e>n.maxs[3])return 1;if(1===t&&e>n.maxs[4])return 1;if(2===t&&e>n.maxs[5])return 1}if(e>(t?59:23))return 1},n.check=function(){var e=n.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,"\\d+\\").replace(/\\$/g,""),t=new RegExp(e),a=n.elem[d.elemv],s=a.match(/\d+/g)||[],i=n.checkVoid(s[0],s[1],s[2]);if(""!==a.replace(/\s/g,"")){if(!t.test(a))return n.elem[d.elemv]="",n.msg("日期不符合格式,请重新选择。"),1;if(i[0])return n.elem[d.elemv]="",n.msg("日期不在有效期内,请重新选择。"),1;i.value=n.elem[d.elemv].match(t).join(),s=i.value.match(/\d+/g),s[1]<1?(s[1]=1,i.auto=1):s[1]>12?(s[1]=12,i.auto=1):s[1].length<2&&(i.auto=1),s[2]<1?(s[2]=1,i.auto=1):s[2]>n.months[(0|s[1])-1]?(s[2]=31,i.auto=1):s[2].length<2&&(i.auto=1),s.length>3&&(n.timeVoid(s[3],0)&&(i.auto=1),n.timeVoid(s[4],1)&&(i.auto=1),n.timeVoid(s[5],2)&&(i.auto=1)),i.auto?n.creation([s[0],0|s[1],0|s[2]],1):i.value!==n.elem[d.elemv]&&(n.elem[d.elemv]=i.value)}},n.months=[31,null,31,30,31,30,31,31,30,31,30,31],n.viewDate=function(e,t,a){var s=(n.query,{}),i=new Date;e<(0|n.mins[0])&&(e=0|n.mins[0]),e>(0|n.maxs[0])&&(e=0|n.maxs[0]),i.setFullYear(e,t,a),s.ymd=[i.getFullYear(),i.getMonth(),i.getDate()],n.months[1]=n.isleap(s.ymd[0])?29:28,i.setFullYear(s.ymd[0],s.ymd[1],1),s.FDay=i.getDay(),s.PDay=n.months[0===t?11:t-1]-s.FDay+1,s.NDay=1,n.each(d.tds,function(e,t){var a,i=s.ymd[0],o=s.ymd[1]+1;t.className="",e<s.FDay?(t.innerHTML=a=e+s.PDay,n.addClass(t,"laydate_nothis"),1===o&&(i-=1),o=1===o?12:o-1):e>=s.FDay&&e<s.FDay+n.months[s.ymd[1]]?(t.innerHTML=a=e-s.FDay+1,e-s.FDay+1===s.ymd[2]&&(n.addClass(t,d[2]),s.thisDay=t)):(t.innerHTML=a=s.NDay++,n.addClass(t,"laydate_nothis"),12===o&&(i+=1),o=12===o?1:o+1),n.checkVoid(i,o,a)[0]&&n.addClass(t,d[1]),n.options.festival&&n.festival(t,o+"."+a),t.setAttribute("y",i),t.setAttribute("m",o),t.setAttribute("d",a),i=o=a=null}),n.valid=!n.hasClass(s.thisDay,d[1]),n.ymd=s.ymd,d.year.value=n.ymd[0]+"年",d.month.value=n.digit(n.ymd[1]+1)+"月",n.each(d.mms,function(e,t){var a=n.checkVoid(n.ymd[0],(0|t.getAttribute("m"))+1);"y"===a[0]||"m"===a[0]?n.addClass(t,d[1]):n.removeClass(t,d[1]),n.removeClass(t,d[2]),a=null}),n.addClass(d.mms[n.ymd[1]],d[2]),s.times=[0|n.inymd[3]||0,0|n.inymd[4]||0,0|n.inymd[5]||0],n.each(new Array(3),function(e){n.hmsin[e].value=n.digit(n.timeVoid(s.times[e],e)?0|n.mins[e+3]:0|s.times[e])}),n[n.valid?"removeClass":"addClass"](d.ok,d[1])},n.festival=function(e,t){var a;switch(t){case"1.1":a="元旦";break;case"3.8":a="妇女";break;case"4.5":a="清明";break;case"5.1":a="劳动";break;case"6.1":a="儿童";break;case"9.10":a="教师";break;case"10.1":a="国庆"}a&&(e.innerHTML=a),a=null},n.viewYears=function(e){var t=n.query,a="";n.each(new Array(14),function(t){a+=7===t?"<li "+(parseInt(d.year.value)===e?'class="'+d[2]+'"':"")+' y="'+e+'">'+e+"年</li>":'<li y="'+(e-7+t)+'">'+(e-7+t)+"年</li>"}),t("#laydate_ys").innerHTML=a,n.each(t("#laydate_ys li"),function(e,t){"y"===n.checkVoid(t.getAttribute("y"))[0]?n.addClass(t,d[1]):n.on(t,"click",function(e){n.stopmp(e).reshow(),n.viewDate(0|this.getAttribute("y"),n.ymd[1],n.ymd[2])})})},n.initDate=function(){var e=(n.query,new Date),t=n.elem[d.elemv].match(/\d+/g)||[];t.length<3&&(t=n.options.start.match(/\d+/g)||[],t.length<3&&(t=[e.getFullYear(),e.getMonth()+1,e.getDate()])),n.inymd=t,n.viewDate(t[0],t[1]-1,t[2])},n.iswrite=function(){var e=n.query,t={time:e("#laydate_hms")};n.shde(t.time,!n.options.istime),n.shde(d.oclear,!("isclear"in n.options?n.options.isclear:1)),n.shde(d.otoday,!("istoday"in n.options?n.options.istoday:1)),n.shde(d.ok,!("issure"in n.options?n.options.issure:1))},n.orien=function(e,t){var a,s=n.elem.getBoundingClientRect();e.style.left=s.left+(t?0:n.scroll(1))+"px",a=s.bottom+e.offsetHeight/1.5<=n.winarea()?s.bottom-1:s.top>e.offsetHeight/1.5?s.top-e.offsetHeight+1:n.winarea()-e.offsetHeight,e.style.top=Math.max(a+(t?0:n.scroll()),1)+"px"},n.follow=function(e){n.options.fixed?(e.style.position="fixed",n.orien(e,1)):(e.style.position="absolute",n.orien(e))},n.viewtb=function(){var e,t=[],a=["日","一","二","三","四","五","六"],o={},d=s[i]("table"),r=s[i]("thead");return r.appendChild(s[i]("tr")),o.creath=function(e){var t=s[i]("th");t.innerHTML=a[e],r[l]("tr")[0].appendChild(t),t=null},n.each(new Array(6),function(a){t.push([]),e=d.insertRow(0),n.each(new Array(7),function(n){t[a][n]=0,0===a&&o.creath(n),e.insertCell(n)})}),d.insertBefore(r,d.children[0]),d.id=d.className="laydate_table",e=t=null,d.outerHTML.toLowerCase()}(),n.view=function(e,t){var o,l=n.query,r={};t=t||e,n.elem=e,n.options=t,n.options.format||(n.options.format=a.format),n.options.start=n.options.start||"",n.mm=r.mm=[n.options.min||a.min,n.options.max||a.max],n.mins=r.mm[0].match(/\d+/g),n.maxs=r.mm[1].match(/\d+/g),n.box?n.shde(n.box):(o=s[i]("div"),o.id=d[0],o.className=d[0],o.style.cssText="position: absolute;",o.setAttribute("name","laydate-v"+laydate.v),o.innerHTML=r.html='<div class="laydate_top"><div class="laydate_ym laydate_y" id="laydate_YY"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_y" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms"><a class="laydate_tab laydate_chtop"><cite></cite></a><ul id="laydate_ys"></ul><a class="laydate_tab laydate_chdown"><cite></cite></a></div></div><div class="laydate_ym laydate_m" id="laydate_MM"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_m" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms" id="laydate_ms">'+function(){var e="";return n.each(new Array(12),function(t){e+='<span m="'+t+'">'+n.digit(t+1)+"月</span>"}),e}()+"</div></div></div>"+n.viewtb+'<div class="laydate_bottom"><ul id="laydate_hms"><li class="laydate_sj">时间</li><li><input readonly>:</li><li><input readonly>:</li><li><input readonly></li></ul><div class="laydate_time" id="laydate_time"></div><div class="laydate_btn"><a id="laydate_clear">清空</a><a id="laydate_today">今天</a><a id="laydate_ok">确认</a></div>'+(a.isv?'<a href="http://sentsin.com/layui/laydate/" class="laydate_v" target="_blank">laydate-v'+laydate.v+"</a>":"")+"</div>",s.body.appendChild(o),n.box=l("#"+d[0]),n.events(),o=null),n.follow(n.box),t.zIndex?n.box.style.zIndex=t.zIndex:n.removeCssAttr(n.box,"z-index"),n.stopMosup("click",n.box),n.initDate(),n.iswrite(),n.check()},n.reshow=function(){return n.each(n.query("#"+d[0]+" .laydate_show"),function(e,t){n.removeClass(t,"laydate_show")}),this},n.close=function(){n.reshow(),n.shde(n.query("#"+d[0]),1),n.elem=null},n.parse=function(e,t,s){return e=e.concat(t),s=s||(n.options?n.options.format:a.format),s.replace(/YYYY|MM|DD|hh|mm|ss/g,function(t,a){return e.index=0|++e.index,n.digit(e[e.index])})},n.creation=function(e,t){var a=(n.query,n.hmsin),s=n.parse(e,[a[0].value,a[1].value,a[2].value]);n.elem[d.elemv]=s,t||(n.close(),"function"==typeof n.options.choose&&n.options.choose(s))},n.events=function(){var e=n.query,a={box:"#"+d[0]};n.addClass(s.body,"laydate_body"),d.tds=e("#laydate_table td"),d.mms=e("#laydate_ms span"),d.year=e("#laydate_y"),d.month=e("#laydate_m"),n.each(e(a.box+" .laydate_ym"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.addClass(this[l]("div")[0],"laydate_show"),e||(a.YY=parseInt(d.year.value),n.viewYears(a.YY))})}),n.on(e(a.box),"click",function(){n.reshow()}),a.tabYear=function(e){0===e?n.ymd[0]--:1===e?n.ymd[0]++:2===e?a.YY-=14:a.YY+=14,e<2?(n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2]),n.reshow()):n.viewYears(a.YY)},n.each(e("#laydate_YY .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t),a.tabYear(e)})}),a.tabMonth=function(e){e?(n.ymd[1]++,12===n.ymd[1]&&(n.ymd[0]++,n.ymd[1]=0)):(n.ymd[1]--,n.ymd[1]===-1&&(n.ymd[0]--,n.ymd[1]=11)),n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2])},n.each(e("#laydate_MM .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),a.tabMonth(e)})}),n.each(e("#laydate_ms span"),function(e,t){n.on(t,"click",function(e){n.stopmp(e).reshow(),n.hasClass(this,d[1])||n.viewDate(n.ymd[0],0|this.getAttribute("m"),n.ymd[2])})}),n.each(e("#laydate_table td"),function(e,t){n.on(t,"click",function(e){n.hasClass(this,d[1])||(n.stopmp(e),n.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),d.oclear=e("#laydate_clear"),n.on(d.oclear,"click",function(){n.elem[d.elemv]="",n.close()}),d.otoday=e("#laydate_today"),n.on(d.otoday,"click",function(){var e=new Date;n.creation([e.getFullYear(),e.getMonth()+1,e.getDate()])}),d.ok=e("#laydate_ok"),n.on(d.ok,"click",function(){n.valid&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])}),a.times=e("#laydate_time"),n.hmsin=a.hmsin=e("#laydate_hms input"),a.hmss=["小时","分钟","秒数"],a.hmsarr=[],n.msg=function(t,s){var i='<div class="laydte_hsmtex">'+(s||"提示")+"<span>×</span></div>";"string"==typeof t?(i+="<p>"+t+"</p>",n.shde(e("#"+d[0])),n.removeClass(a.times,"laydate_time1").addClass(a.times,"laydate_msg")):(a.hmsarr[t]?i=a.hmsarr[t]:(i+='<div id="laydate_hmsno" class="laydate_hmsno">',n.each(new Array(0===t?24:60),function(e){i+="<span>"+e+"</span>"}),i+="</div>",a.hmsarr[t]=i),n.removeClass(a.times,"laydate_msg"),n[0===t?"removeClass":"addClass"](a.times,"laydate_time1")),n.addClass(a.times,"laydate_show"),a.times.innerHTML=i},a.hmson=function(t,a){var s=e("#laydate_hmsno span"),i=n.valid?null:1;n.each(s,function(e,s){i?n.addClass(s,d[1]):n.timeVoid(e,a)?n.addClass(s,d[1]):n.on(s,"click",function(e){n.hasClass(this,d[1])||(t.value=n.digit(0|this.innerHTML))})}),n.addClass(s[0|t.value],"laydate_click")},n.each(a.hmsin,function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.msg(e,a.hmss[e]),a.hmson(this,e)})}),n.on(s,"mouseup",function(){var t=e("#"+d[0]);t&&"none"!==t.style.display&&(n.check()||n.close())}).on(s,"keydown",function(e){e=e||t.event;var a=e.keyCode;13===a&&n.elem&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])})},laydate.reset=function(){n.box&&n.elem&&n.follow(n.box)},laydate.now=function(e,t){var a=new Date(0|e?function(e){return e<864e5?+new Date+864e5*e:e}(parseInt(e)):+new Date);return n.parse([a.getFullYear(),a.getMonth()+1,a.getDate()],[a.getHours(),a.getMinutes(),a.getSeconds()],t)},layui.addcss("modules/laydate/laydate.css",function(){},"laydatecss"),e("laydate",laydate)}); \ No newline at end of file diff --git a/Public/layui/lay/modules/layedit.js b/Public/layui/lay/modules/layedit.js new file mode 100644 index 0000000..891d287 --- /dev/null +++ b/Public/layui/lay/modules/layedit.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define(["layer","form"],function(t){"use strict";var e=layui.jquery,i=layui.layer,a=layui.form(),l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",s=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};s.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},s.prototype.on=function(t,e){return layui.onevent(n,t,e)},s.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",s=e("#"+t),u="LAY_layedit_"+ ++a.index,d=s.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(['<div class="'+r+'">','<div class="layui-unselect layui-layedit-tool">'+f+"</div>",'<div class="layui-layedit-iframe">','<iframe id="'+u+'" name="'+u+'" textarea="'+t+'" frameborder="0"></iframe>',"</div>","</div>"].join(""));return l.ie&&l.ie<8?s.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),c.call(a,m,s[0],y),s.addClass("layui-hide").after(m),a.index)},s.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},s.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},s.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))}},s.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 c=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"),s=o.find("head"),c=e(["<style>","*{margin: 0; padding: 0;}","body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}","a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}","p{margin-bottom: 10px;}","img{display: inline-block; border: none; vertical-align: middle;}","pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}","</style>"].join("")),u=o.find("body");s.append(c),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,s=e(r.body);s.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("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"<p>")}}),e(n).parents("form").on("submit",function(){var t=s.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),s.on("paste",function(e){r.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){f.call(t,s),n.value=s.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),s={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({url:r.url,method:r.type,elem:e(n).find("input")[0],unwrap:!0,success: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||"上传失败")}})})},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:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},c=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,"<p>"),setTimeout(function(){o.focus()},10)):s[a]&&s[a].call(this,u),h.call(t,c,i)}},d=/image/;c.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,c),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:"超链接",skin:"layui-layer-msg",content:['<ul class="layui-form" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">URL</label>','<div class="layui-input-block" style="margin-left: 90px">','<input name="url" lay-verify="url" value="'+(t.href||"")+'" autofocus="true" autocomplete="off" class="layui-input">',"</div>","</li>",'<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">打开方式</label>','<div class="layui-input-block" style="margin-left: 90px">','<input type="radio" name="target" value="_self" class="layui-input" title="当前窗口"'+("_self"!==t.target&&t.target?"":"checked")+">",'<input type="radio" name="target" value="_blank" class="layui-input" title="新窗口" '+("_blank"===t.target?"checked":"")+">","</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],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('<li title="'+e+'"><img src="'+i+'" alt="'+e+'"></li>')}),'<ul class="layui-clear">'+t.join("")+"</ul>"}(),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:"插入代码",skin:"layui-layer-msg",content:['<ul class="layui-form layui-form-pane" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label">请选择语言</label>','<div class="layui-input-block">','<select name="lang">','<option value="JavaScript">JavaScript</option>','<option value="HTML">HTML</option>','<option value="CSS">CSS</option>','<option value="Java">Java</option>','<option value="PHP">PHP</option>','<option value="C#">C#</option>','<option value="Python">Python</option>','<option value="Ruby">Ruby</option>','<option value="Go">Go</option>',"</select>","</div>","</li>",'<li class="layui-form-item layui-form-text">','<label class="layui-form-label">代码</label>','<div class="layui-input-block">','<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>',"</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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:'<i class="layui-icon layedit-tool-html" title="HTML源代码" lay-command="html" layedit-event="html""></i><span class="layedit-tool-mid"></span>',strong:'<i class="layui-icon layedit-tool-b" title="加粗" lay-command="Bold" layedit-event="b""></i>',italic:'<i class="layui-icon layedit-tool-i" title="斜体" lay-command="italic" layedit-event="i""></i>',underline:'<i class="layui-icon layedit-tool-u" title="下划线" lay-command="underline" layedit-event="u""></i>',del:'<i class="layui-icon layedit-tool-d" title="删除线" lay-command="strikeThrough" layedit-event="d""></i>',"|":'<span class="layedit-tool-mid"></span>',left:'<i class="layui-icon layedit-tool-left" title="左对齐" lay-command="justifyLeft" layedit-event="left""></i>',center:'<i class="layui-icon layedit-tool-center" title="居中对齐" lay-command="justifyCenter" layedit-event="center""></i>',right:'<i class="layui-icon layedit-tool-right" title="右对齐" lay-command="justifyRight" layedit-event="right""></i>',link:'<i class="layui-icon layedit-tool-link" title="插入链接" layedit-event="link""></i>',unlink:'<i class="layui-icon layedit-tool-unlink layui-disabled" title="清除链接" lay-command="unlink" layedit-event="unlink""></i>',face:'<i class="layui-icon layedit-tool-face" title="表情" layedit-event="face""></i>',image:'<i class="layui-icon layedit-tool-image" title="图片" layedit-event="image"><input type="file" name="file"></i>',code:'<i class="layui-icon layedit-tool-code" title="插入代码" layedit-event="code"></i>',help:'<i class="layui-icon layedit-tool-help" title="帮助" layedit-event="help"></i>'},w=new s;t(n,w)}); \ No newline at end of file diff --git a/Public/layui/lay/modules/layer.js b/Public/layui/lay/modules/layer.js new file mode 100644 index 0000000..7b036ff --- /dev/null +++ b/Public/layui/lay/modules/layer.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"]},r={v:"3.0.2",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):r.link("skin/"+e.extend),this):this},link:function(t,n,a){if(r.path){var o=i("head")[0],s=document.createElement("link");"string"==typeof n&&(a=n);var l=(a||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,i("#"+f)[0]||o.appendChild(s),"function"==typeof n&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(i("#"+f).css("width"))?n():setTimeout(u,100))}()}},ready:function(e){var t="skinlayercss",i="302";return a?layui.addcss("modules/layer/default/layer.css?v="+r.v+i,e,t):r.link("skin/default/layer.css?v="+r.v+i,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),r.ready(function(){document.body?t.creat():setTimeout(function(){t.creat()},50)})};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; background-color:"+(r.shade[1]||"#000")+"; opacity:"+(r.shade[0]||r.shade)+"; filter:alpha(opacity="+(100*r.shade[0]||100*r.shade)+");")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'<i class="layui-layer-TipsG"></i>',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]&&e.layero.addClass(l.anim[t.anim]).data("anim",!0)}},s.pt.auto=function(e){function t(e){e=s.find(e),e.height(f[1]-c-u-2*(0|parseFloat(e.css("padding"))))}var a=this,o=a.config,s=i("#"+l[0]+e);""===o.area[0]&&o.maxWidth>0&&(r.ie&&r.ie<8&&o.btn&&s.width(s.innerWidth()),s.outerWidth()>o.maxWidth&&s.width(o.maxWidth));var f=[s.innerWidth(),s.innerHeight()],c=s.find(l[1]).outerHeight()||0,u=s.find("."+l[6]).outerHeight()||0;switch(o.type){case 2:t("iframe");break;default:""===o.area[1]?o.fixed&&f[1]>=n.height()&&(f[1]=n.height(),t("."+l[5])):t("."+l[5])}return a},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("anim")&&t.addClass(a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),setTimeout(function(){f()},r.ie&&r.ie<10||!t.data("anim")?0:200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'<textarea class="layui-layer-input"'+a+">"+(e.value||"")+"</textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input" value="'+(e.value||"")+'">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,n="";if(e>0)for(n='<span class="layui-layer-tabnow">'+t[0].title+"</span>";i<e;i++)n+="<span>"+t[i].title+"</span>";return n}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,n="";if(e>0)for(n='<li class="layui-layer-tabli xubox_tab_layer">'+(t[0].content||"no content")+"</li>";i<e;i++)n+='<li class="layui-layer-tabli">'+(t[i].content||"no content")+"</li>";return n}()+"</ul>",success:function(t){var a=t.find(".layui-layer-title").children(),o=t.find(".layui-layer-tabmain").children();a.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var n=i(this),a=n.index();n.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),o.eq(a).show().siblings().hide(),"function"==typeof e.change&&e.change(a)}),"function"==typeof n&&n(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){u.length<=1||(f.start=s.imgIndex-1,r.close(s.index),setTimeout(function(){r.photos(t,!0,e)},200))},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,anim:5*Math.random()|0,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常<br>是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.jquery),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/Public/layui/lay/modules/laypage.js b/Public/layui/lay/modules/laypage.js new file mode 100644 index 0000000..ed2ffa3 --- /dev/null +++ b/Public/layui/lay/modules/laypage.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define(function(a){"use strict";function t(a){new p(a)}var e=document,r="getElementById",n="getElementsByTagName",s=0,p=function(a){var t=this,e=t.config=a||{};e.item=s++,t.render(!0)};p.on=function(a,t,e){return a.attachEvent?a.attachEvent("on"+t,function(){e.call(a,window.even)}):a.addEventListener(t,e,!1),p},p.prototype.type=function(){var a=this.config;if("object"==typeof a.cont)return void 0===a.cont.length?2:3},p.prototype.view=function(){var a=this,t=a.config,e=[],r={};if(t.pages=0|t.pages,t.curr=0|t.curr||1,t.groups="groups"in t?0|t.groups:5,t.first="first"in t?t.first:"首页",t.last="last"in t?t.last:"末页",t.prev="prev"in t?t.prev:"上一页",t.next="next"in t?t.next:"下一页",t.pages<=1)return"";for(t.groups>t.pages&&(t.groups=t.pages),r.index=Math.ceil((t.curr+(t.groups>1&&t.groups!==t.pages?1:0))/(0===t.groups?1:t.groups)),t.curr>1&&t.prev&&e.push('<a href="javascript:;" class="layui-laypage-prev" data-page="'+(t.curr-1)+'">'+t.prev+"</a>"),r.index>1&&t.first&&0!==t.groups&&e.push('<a href="javascript:;" class="laypage_first" data-page="1" title="首页">'+t.first+"</a><span>…</span>"),r.poor=Math.floor((t.groups-1)/2),r.start=r.index>1?t.curr-r.poor:1,r.end=r.index>1?function(){var a=t.curr+(t.groups-r.poor-1);return a>t.pages?t.pages:a}():t.groups,r.end-r.start<t.groups-1&&(r.start=r.end-t.groups+1);r.start<=r.end;r.start++)r.start===t.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(t.skin)?'style="background-color:'+t.skin+';"':"")+"></em><em>"+r.start+"</em></span>"):e.push('<a href="javascript:;" data-page="'+r.start+'">'+r.start+"</a>");return t.pages>t.groups&&r.end<t.pages&&t.last&&0!==t.groups&&e.push('<span>…</span><a href="javascript:;" class="layui-laypage-last" title="尾页" data-page="'+t.pages+'">'+t.last+"</a>"),r.flow=!t.prev&&0===t.groups,(t.curr!==t.pages&&t.next||r.flow)&&e.push(function(){return r.flow&&t.curr===t.pages?'<span class="layui-laypage-nomore" title="已没有更多">'+t.next+"</span>":'<a href="javascript:;" class="layui-laypage-next" data-page="'+(t.curr+1)+'">'+t.next+"</a>"}()),'<div class="layui-box layui-laypage layui-laypage-'+(t.skin?function(a){return/^#/.test(a)?"molv":a}(t.skin):"default")+'" id="layui-laypage-'+a.config.item+'">'+e.join("")+function(){return t.skip?'<span class="layui-laypage-total">到第 <input type="number" min="1" onkeyup="this.value=this.value.replace(/\\D/, \'\');" value="'+t.curr+'" class="layui-laypage-skip"> 页 <button type="button" class="layui-laypage-btn">确定</button></span>':""}()+"</div>"},p.prototype.jump=function(a){if(a){for(var t=this,e=t.config,r=a.children,s=a[n]("button")[0],i=a[n]("input")[0],u=0,o=r.length;u<o;u++)"a"===r[u].nodeName.toLowerCase()&&p.on(r[u],"click",function(){var a=0|this.getAttribute("data-page");e.curr=a,t.render()});s&&p.on(s,"click",function(){var a=0|i.value.replace(/\s|\D/g,"");a&&a<=e.pages&&(e.curr=a,t.render())})}},p.prototype.render=function(a){var t=this,n=t.config,s=t.type(),p=t.view();2===s?n.cont.innerHTML=p:3===s?n.cont.html(p):e[r](n.cont).innerHTML=p,n.jump&&n.jump(n,a),t.jump(e[r]("layui-laypage-"+n.item)),n.hash&&!a&&(location.hash="!"+n.hash+"="+n.curr)},a("laypage",t)}); \ No newline at end of file diff --git a/Public/layui/lay/modules/laytpl.js b/Public/layui/lay/modules/laytpl.js new file mode 100644 index 0000000..524283e --- /dev/null +++ b/Public/layui/lay/modules/laytpl.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},n={exp:function(e){return new RegExp(e,"g")},query:function(e,n,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return c((n||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/Public/layui/lay/modules/mobile.js b/Public/layui/lay/modules/mobile.js new file mode 100644 index 0000000..56e98b6 --- /dev/null +++ b/Public/layui/lay/modules/mobile.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},n={exp:function(e){return new RegExp(e,"g")},query:function(e,n,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return c((n||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'<h3 style="'+(e?i.title[1]:"")+'">'+(e?i.title[0]:i.title)+"</h3>":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e='<span yes type="1">'+i.btn[0]+"</span>",2===t&&(e='<span no type="0">'+i.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(i.content||"")+"</p>"),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"<div "+("string"==typeof i.shade?'style="'+i.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(i.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(i.skin?"layui-m-layer-"+i.skin+" ":"")+(i.className?i.className:"")+" "+(i.anim?"layui-m-anim-"+i.anim:"")+'" '+(i.style?'style="'+i.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+i.content+"</div>"+d+"</div></div></div>",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r<o;r++)l.touch(s[r],a);if(e.shade&&e.shadeClose){var d=t[n]("layui-m-layershade")[0];l.touch(d,function(){c.close(i.index,e.end)})}e.end&&(l.end[i.index]=e.end)};var c={v:"2.0 m",index:o,open:function(e){var t=new d(e||{});return t.index},close:function(e){var i=a("#"+r[0]+e)[0];i&&(i.innerHTML="",t.body.removeChild(i),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[n](r[0]),i=0,a=e.length;i<a;i++)c.close(0|e[0].getAttribute("index"))}};e("layer-mobile",c)});layui.define(function(t){var e=function(){function t(t){return null==t?String(t):J[W.call(t)]||"object"}function e(e){return"function"==t(e)}function n(t){return null!=t&&t==t.window}function r(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function i(e){return"object"==t(e)}function o(t){return i(t)&&!n(t)&&Object.getPrototypeOf(t)==Object.prototype}function a(t){var e=!!t&&"length"in t&&t.length,r=T.type(t);return"function"!=r&&!n(t)&&("array"==r||0===e||"number"==typeof e&&e>0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n<r;n++)this[n]=t[n];this.length=r,this.selector=e||""}function m(t,e,n){for(j in e)n&&(o(e[j])||Q(e[j]))?(o(e[j])&&!o(t[j])&&(t[j]={}),Q(e[j])&&!Q(t[j])&&(t[j]=[]),m(t[j],e[j],n)):e[j]!==E&&(t[j]=e[j])}function v(t,e){return null==e?T(t):T(t).filter(e)}function g(t,n,r,i){return e(n)?n.call(t,r,i):n}function y(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function x(t,e){var n=t.className||"",r=n&&n.baseVal!==E;return e===E?r?n.baseVal:n:void(r?n.baseVal=e:t.className=e)}function b(t){try{return t?"true"==t||"false"!=t&&("null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?T.parseJSON(t):t):t}catch(e){return t}}function w(t,e){e(t);for(var n=0,r=t.childNodes.length;n<r;n++)w(t.childNodes[n],e)}var E,j,T,S,C,N,O=[],P=O.concat,A=O.filter,D=O.slice,L=window.document,$={},F={},k={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},M=/^\s*<(\w+|!)[^>]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1></$2>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r<t.length;r++)n=e(t[r],r),null!=n&&o.push(n);else for(i in t)n=e(t[i],i),null!=n&&o.push(n);return u(o)},T.each=function(t,e){var n,r;if(a(t)){for(n=0;n<t.length;n++)if(e.call(t[n],n,t[n])===!1)return t}else for(r in t)if(e.call(t[r],r,t[r])===!1)return t;return t},T.grep=function(t,e){return A.call(t,e)},window.JSON&&(T.parseJSON=JSON.parse),T.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(t,e){J["[object "+e+"]"]=e.toLowerCase()}),T.fn={constructor:Y.Z,length:0,forEach:O.forEach,reduce:O.reduce,push:O.push,sort:O.sort,splice:O.splice,indexOf:O.indexOf,concat:function(){var t,e,n=[];for(t=0;t<arguments.length;t++)e=arguments[t],n[t]=Y.isZ(e)?e.toArray():e;return P.apply(Y.isZ(this)?this.toArray():this,n)},map:function(t){return T(T.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return T(D.apply(this,arguments))},ready:function(t){return U.test(L.readyState)&&L.body?t(T):L.addEventListener("DOMContentLoaded",function(){t(T)},!1),this},get:function(t){return t===E?D.call(this):this[t>=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("<div>").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:0})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('<iframe id="'+n+'" class="'+n+'" name="'+n+'"></iframe>');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='<form target="'+n+'" method="'+(a.method||"post")+'" key="set-mine" enctype="multipart/form-data" action="'+(a.url||"")+'"></form>',l=s.attr("lay-type")||a.type;a.unwrap||(u='<div class="layui-box layui-upload-button">'+u+'<span class="layui-upload-icon"><i class="layui-icon"></i>'+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"</span></div>"),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/Public/layui/lay/modules/tree.js b/Public/layui/lay/modules/tree.js new file mode 100644 index 0000000..221c062 --- /dev/null +++ b/Public/layui/lay/modules/tree.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var o=layui.jquery,a=layui.hint(),r="layui-tree-enter",i=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};i.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},i.prototype.tree=function(e,a){var r=this,i=r.options,n=a||i.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('<ul class="'+(n.spread?"layui-show":"")+'"></ul>'),s=o(["<li "+(n.spread?'data-spread="'+n.spread+'"':"")+">",function(){return l?'<i class="layui-icon layui-tree-spread">'+(n.spread?t.arrow[1]:t.arrow[0])+"</i>":""}(),function(){return i.check?'<i class="layui-icon layui-tree-check">'+("checkbox"===i.check?t.checkbox[0]:"radio"===i.check?t.radio[0]:"")+"</i>":""}(),function(){return'<a href="'+(n.href||"javascript:;")+'" '+(i.target&&n.href?'target="'+i.target+'"':"")+">"+('<i class="layui-icon layui-tree-'+(l?"branch":"leaf")+'">'+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"</i>")+("<cite>"+(n.name||"未命名")+"</cite></a>")}(),"</li>"].join(""));l&&(s.append(c),r.tree(c,n.children)),e.append(s),"function"==typeof i.click&&r.click(s,n),r.spread(s,n),i.drag&&r.drag(s,n)})},i.prototype.click=function(e,o){var a=this,r=a.options;e.children("a").on("click",function(e){layui.stope(e),r.click(o)})},i.prototype.spread=function(e,o){var a=this,r=(a.options,e.children(".layui-tree-spread")),i=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),i.removeClass("layui-show"),r.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),i.addClass("layui-show"),r.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};i[0]&&(r.on("click",l),n.on("dblclick",l))},i.prototype.on=function(e){var a=this,i=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),i.drag&&o(document).on("mousemove",function(e){var r=a.move;if(r.from){var i=(r.to,o('<div class="layui-box '+t+'"></div>'));e.preventDefault(),o("."+t)[0]||o("body").append(i);var n=o("."+t)[0]?o("."+t):i;n.addClass("layui-show").html(r.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(r),e.to&&e.to.elem.children("a").removeClass(r),a.move={},o("."+t).remove())})},i.prototype.move={},i.prototype.drag=function(e,a){var i=this,t=(i.options,e.children("a")),n=function(){var t=o(this),n=i.move;n.from&&(n.to={item:a,elem:e},t.addClass(r))};t.on("mousedown",function(){var o=i.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=i.move;a.from&&(delete a.to,e.removeClass(r))})},e("tree",function(e){var r=new i(e=e||{}),t=o(e.elem);return t[0]?void r.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); \ No newline at end of file diff --git a/Public/layui/lay/modules/upload.js b/Public/layui/lay/modules/upload.js new file mode 100644 index 0000000..d5b78f9 --- /dev/null +++ b/Public/layui/lay/modules/upload.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var a=layui.jquery,t=layui.layer,i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"},s=function(e){this.options=e};s.prototype.init=function(){var e=this,t=e.options,r=a("body"),s=a(t.elem||".layui-upload-file"),u=a('<iframe id="'+n+'" class="'+n+'" name="'+n+'"></iframe>');return a("#"+n)[0]||r.append(u),s.each(function(r,s){s=a(s);var u='<form target="'+n+'" method="'+(t.method||"post")+'" key="set-mine" enctype="multipart/form-data" action="'+(t.url||"")+'"></form>',l=s.attr("lay-type")||t.type;t.unwrap||(u='<div class="layui-box layui-upload-button">'+u+'<span class="layui-upload-icon"><i class="layui-icon"></i>'+(s.attr("lay-title")||t.title||"上传"+(o[l]||"图片"))+"</span></div>"),u=a(u),t.unwrap||u.on("dragover",function(e){e.preventDefault(),a(this).addClass(i)}).on("dragleave",function(){a(this).removeClass(i)}).on("drop",function(){a(this).removeClass(i)}),s.parent("form").attr("target")===n&&(t.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=a(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return t.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return t.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return t.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return t.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=a("#"+n),f=setInterval(function(){var a;try{a=c.contents().find("body").text()}catch(i){t.msg("上传接口存在跨域",r),clearInterval(f)}if(a){clearInterval(f),c.contents().find("body").html("");try{a=JSON.parse(a)}catch(i){return a={},t.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(a,e)}},30);e.value=""}},e("upload",function(e){var a=new s(e=e||{});a.init()})}); \ No newline at end of file diff --git a/Public/layui/lay/modules/util.js b/Public/layui/lay/modules/util.js new file mode 100644 index 0000000..2f6938f --- /dev/null +++ b/Public/layui/lay/modules/util.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;layui.define("jquery",function(l){"use strict";var o=layui.jquery,i={fixbar:function(l){l=l||{},l.bgcolor=l.bgcolor?"background-color:"+l.bgcolor:"";var i,a,c="layui-fixbar-top",t=[l.bar1===!0?"":l.bar1,l.bar2===!0?"":l.bar2,""],r=o(['<ul class="layui-fixbar">',l.bar1?'<li class="layui-icon" lay-type="bar1" style="'+l.bgcolor+'">'+t[0]+"</li>":"",l.bar2?'<li class="layui-icon" lay-type="bar2" style="'+l.bgcolor+'">'+t[1]+"</li>":"",'<li class="layui-icon '+c+'" lay-type="top" style="'+l.bgcolor+'">'+t[2]+"</li>","</ul>"].join("")),e=r.find("."+c),s=function(){var i=o(document).scrollTop();i>=(l.showHeight||200)?a||(e.show(),a=1):a&&(e.hide(),a=0)};o(".layui-fixbar")[0]||("object"==typeof l.css&&r.css(l.css),o("body").append(r),s(),r.find("li").on("click",function(){var i=o(this),a=i.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),l.click&&l.click.call(this,a)}),o(document).on("scroll",function(){i&&clearTimeout(i),i=setTimeout(function(){s()},100)}))}};l("util",i)}); \ No newline at end of file diff --git a/Public/layui/layui.js b/Public/layui/layui.js new file mode 100644 index 0000000..ed8835f --- /dev/null +++ b/Public/layui/layui.js @@ -0,0 +1,2 @@ +/** layui-v1.0.9_rls MIT License By http://www.layui.com */ + ;!function(e){"use strict";var t=function(){this.v="1.0.9_rls"};t.fn=t.prototype;var n=document,o=t.fn.cache={},i=function(){var e=n.scripts,t=e[e.length-1].src;return t.substring(0,t.lastIndexOf("/")+1)}(),r=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},l="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),a={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"dest/layui.all"};o.modules={},o.status={},o.timeout=10,o.event={},t.fn.define=function(e,t){var n=this,i="function"==typeof e,r=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return i&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?r.call(n):(n.use(e,r),n)},t.fn.use=function(e,t,u){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[m]=t,y.removeChild(p),function i(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void(o.status[m]?c():setTimeout(i,4))}())}function c(){u.push(layui[m]),e.length>1?f.use(e.slice(1),t,u):"function"==typeof t&&t.apply(layui,u)}var f=this,d=o.dir=o.dir?o.dir:i,y=n.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(f.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=jQuery);var m=e[0],v=0;if(u=u||[],o.host=o.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&a[m]||!layui["layui.all"]&&layui["layui.mobile"]&&a[m])return c(),f;var p=n.createElement("script"),h=(a[m]?d+"lay/":o.base||"")+(f.modules[m]||m)+".js";return p.async=!0,p.charset="utf-8",p.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),o.modules[m]?!function g(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void("string"==typeof o.modules[m]&&o.status[m]?c():setTimeout(g,4))}():(y.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||l?p.addEventListener("load",function(e){s(e,h)},!1):p.attachEvent("onreadystatechange",function(e){s(e,h)})),o.modules[m]=h,f},t.fn.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},t.fn.link=function(e,t,i){var l=this,a=n.createElement("link"),u=n.getElementsByTagName("head")[0];"string"==typeof t&&(i=t);var s=(i||e).replace(/\.|\//g,""),c=a.id="layuicss-"+s,f=0;a.rel="stylesheet",a.href=e+(o.debug?"?v="+(new Date).getTime():""),a.media="all",n.getElementById(c)||u.appendChild(a),"function"==typeof t&&!function d(){return++f>1e3*o.timeout/100?r(e+" timeout"):void(1989===parseInt(l.getStyle(n.getElementById(c),"width"))?function(){t()}():setTimeout(d,100))}()},t.fn.addcss=function(e,t,n){layui.link(o.dir+"css/"+e,t,n)},t.fn.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,t(o)},void(o.onerror=function(e){o.onerror=null,n(e)}))},t.fn.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},t.fn.modules=function(){var e={};for(var t in a)e[t]=a[t];return e}(),t.fn.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?r("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},t.fn.router=function(e){for(var t,n=(e||location.hash).replace(/^#/,"").split("/")||[],o={dir:[]},i=0;i<n.length;i++)t=n[i].split("="),/^\w+=/.test(n[i])?function(){"dir"!==t[0]&&(o[t[0]]=t[1])}():o.dir.push(n[i]),t=null;return o},t.fn.data=function(t,n){if(t=t||"layui",e.JSON&&e.JSON.parse){if(null===n)return delete localStorage[t];n="object"==typeof n?n:{key:n};try{var o=JSON.parse(localStorage[t])}catch(i){var o={}}return n.value&&(o[n.key]=n.value),n.remove&&delete o[n.key],localStorage[t]=JSON.stringify(o),n.key?o[n.key]:o}},t.fn.device=function(t){var n=navigator.userAgent.toLowerCase(),o=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},i={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:o("micromessenger")};return t&&!i[t]&&(i[t]=o(t)),i.android=/android/.test(n),i.ios="ios"===i.os,i},t.fn.hint=function(){return{error:r}},t.fn.each=function(e,t){var n,o=this;if("function"!=typeof t)return o;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return o},t.fn.stope=function(t){t=t||e.event,t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},t.fn.onevent=function(e,t,n){return"string"!=typeof e||"function"!=typeof n?this:(o.event[e+"."+t]=[n],this)},t.fn.event=function(e,t,n){var i=this,r=null,l=t.match(/\(.*\)$/)||[],a=(t=e+"."+t).replace(l,""),u=function(e,t){var o=t&&t.call(i,n);o===!1&&null===r&&(r=!1)};return layui.each(o.event[a],u),l[0]&&layui.each(o.event[t],u),r},e.layui=new t}(window); \ No newline at end of file diff --git a/ThinkPHP/Common/functions.php b/ThinkPHP/Common/functions.php new file mode 100644 index 0000000..417f046 --- /dev/null +++ b/ThinkPHP/Common/functions.php @@ -0,0 +1,1550 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +/** + * Think 系统函数库 + */ + +/** + * 获取和设置配置参数 支持批量定义 + * @param string|array $name 配置变量 + * @param mixed $value 配置值 + * @param mixed $default 默认值 + * @return mixed + */ +function C($name=null, $value=null,$default=null) { + static $_config = array(); + // 无参数时获取所有 + if (empty($name)) { + return $_config; + } + // 优先执行设置获取或赋值 + if (is_string($name)) { + if (!strpos($name, '.')) { + $name = strtoupper($name); + if (is_null($value)) + return isset($_config[$name]) ? $_config[$name] : $default; + $_config[$name] = $value; + return null; + } + // 二维数组设置和获取支持 + $name = explode('.', $name); + $name[0] = strtoupper($name[0]); + if (is_null($value)) + return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default; + $_config[$name[0]][$name[1]] = $value; + return null; + } + // 批量设置 + if (is_array($name)){ + $_config = array_merge($_config, array_change_key_case($name,CASE_UPPER)); + return null; + } + return null; // 避免非法参数 +} + +/** + * 加载配置文件 支持格式转换 仅支持一级配置 + * @param string $file 配置文件名 + * @param string $parse 配置解析方法 有些格式需要用户自己解析 + * @return array + */ +function load_config($file,$parse=CONF_PARSE){ + $ext = pathinfo($file,PATHINFO_EXTENSION); + switch($ext){ + case 'php': + return include $file; + case 'ini': + return parse_ini_file($file); + case 'yaml': + return yaml_parse_file($file); + case 'xml': + return (array)simplexml_load_file($file); + case 'json': + return json_decode(file_get_contents($file), true); + default: + if(function_exists($parse)){ + return $parse($file); + }else{ + E(L('_NOT_SUPPORT_').':'.$ext); + } + } +} + +/** + * 解析yaml文件返回一个数组 + * @param string $file 配置文件名 + * @return array + */ +if (!function_exists('yaml_parse_file')) { + function yaml_parse_file($file) { + vendor('spyc.Spyc'); + return Spyc::YAMLLoad($file); + } +} + +/** + * 抛出异常处理 + * @param string $msg 异常消息 + * @param integer $code 异常代码 默认为0 + * @throws Think\Exception + * @return void + */ +function E($msg, $code=0) { + throw new Think\Exception($msg, $code); +} + +/** + * 记录和统计时间(微秒)和内存使用情况 + * 使用方法: + * <code> + * G('begin'); // 记录开始标记位 + * // ... 区间运行代码 + * G('end'); // 记录结束标签位 + * echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位 + * echo G('begin','end','m'); // 统计区间内存使用情况 + * 如果end标记位没有定义,则会自动以当前作为标记位 + * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效 + * </code> + * @param string $start 开始标签 + * @param string $end 结束标签 + * @param integer|string $dec 小数位或者m + * @return mixed + */ +function G($start,$end='',$dec=4) { + static $_info = array(); + static $_mem = array(); + if(is_float($end)) { // 记录时间 + $_info[$start] = $end; + }elseif(!empty($end)){ // 统计时间和内存使用 + if(!isset($_info[$end])) $_info[$end] = microtime(TRUE); + if(MEMORY_LIMIT_ON && $dec=='m'){ + if(!isset($_mem[$end])) $_mem[$end] = memory_get_usage(); + return number_format(($_mem[$end]-$_mem[$start])/1024); + }else{ + return number_format(($_info[$end]-$_info[$start]),$dec); + } + + }else{ // 记录时间和内存使用 + $_info[$start] = microtime(TRUE); + if(MEMORY_LIMIT_ON) $_mem[$start] = memory_get_usage(); + } + return null; +} + +/** + * 获取和设置语言定义(不区分大小写) + * @param string|array $name 语言变量 + * @param mixed $value 语言值或者变量 + * @return mixed + */ +function L($name=null, $value=null) { + static $_lang = array(); + // 空参数返回所有定义 + if (empty($name)) + return $_lang; + // 判断语言获取(或设置) + // 若不存在,直接返回全大写$name + if (is_string($name)) { + $name = strtoupper($name); + if (is_null($value)){ + return isset($_lang[$name]) ? $_lang[$name] : $name; + }elseif(is_array($value)){ + // 支持变量 + $replace = array_keys($value); + foreach($replace as &$v){ + $v = '{$'.$v.'}'; + } + return str_replace($replace,$value,isset($_lang[$name]) ? $_lang[$name] : $name); + } + $_lang[$name] = $value; // 语言定义 + return null; + } + // 批量定义 + if (is_array($name)) + $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER)); + return null; +} + +/** + * 添加和获取页面Trace记录 + * @param string $value 变量 + * @param string $label 标签 + * @param string $level 日志级别 + * @param boolean $record 是否记录日志 + * @return void|array + */ +function trace($value='[think]',$label='',$level='DEBUG',$record=false) { + return Think\Think::trace($value,$label,$level,$record); +} + +/** + * 编译文件 + * @param string $filename 文件名 + * @return string + */ +function compile($filename) { + $content = php_strip_whitespace($filename); + $content = trim(substr($content, 5)); + // 替换预编译指令 + $content = preg_replace('/\/\/\[RUNTIME\](.*?)\/\/\[\/RUNTIME\]/s', '', $content); + if(0===strpos($content,'namespace')){ + $content = preg_replace('/namespace\s(.*?);/','namespace \\1{',$content,1); + }else{ + $content = 'namespace {'.$content; + } + if ('?>' == substr($content, -2)) + $content = substr($content, 0, -2); + return $content.'}'; +} + +/** + * 获取模版文件 格式 资源://模块@主题/控制器/操作 + * @param string $template 模版资源地址 + * @param string $layer 视图层(目录)名称 + * @return string + */ +function T($template='',$layer=''){ + + // 解析模版资源地址 + if(false === strpos($template,'://')){ + $template = 'http://'.str_replace(':', '/',$template); + } + $info = parse_url($template); + $file = $info['host'].(isset($info['path'])?$info['path']:''); + $module = isset($info['user'])?$info['user'].'/':MODULE_NAME.'/'; + $extend = $info['scheme']; + $layer = $layer?$layer:C('DEFAULT_V_LAYER'); + + // 获取当前主题的模版路径 + $auto = C('AUTOLOAD_NAMESPACE'); + if($auto && isset($auto[$extend])){ // 扩展资源 + $baseUrl = $auto[$extend].$module.$layer.'/'; + }elseif(C('VIEW_PATH')){ + // 改变模块视图目录 + $baseUrl = C('VIEW_PATH'); + }elseif(defined('TMPL_PATH')){ + // 指定全局视图目录 + $baseUrl = TMPL_PATH.$module; + }else{ + $baseUrl = APP_PATH.$module.$layer.'/'; + } + + // 获取主题 + $theme = substr_count($file,'/')<2 ? C('DEFAULT_THEME') : ''; + + // 分析模板文件规则 + $depr = C('TMPL_FILE_DEPR'); + if('' == $file) { + // 如果模板文件名为空 按照默认规则定位 + $file = CONTROLLER_NAME . $depr . ACTION_NAME; + }elseif(false === strpos($file, '/')){ + $file = CONTROLLER_NAME . $depr . $file; + }elseif('/' != $depr){ + $file = substr_count($file,'/')>1 ? substr_replace($file,$depr,strrpos($file,'/'),1) : str_replace('/', $depr, $file); + } + return $baseUrl.($theme?$theme.'/':'').$file.C('TMPL_TEMPLATE_SUFFIX'); +} + +/** + * 获取输入参数 支持过滤和默认值 + * 使用方法: + * <code> + * I('id',0); 获取id参数 自动判断get或者post + * I('post.name','','htmlspecialchars'); 获取$_POST['name'] + * I('get.'); 获取$_GET + * </code> + * @param string $name 变量的名称 支持指定类型 + * @param mixed $default 不存在的时候默认值 + * @param mixed $filter 参数过滤方法 + * @param mixed $datas 要获取的额外数据源 + * @return mixed + */ +function I($name,$default='',$filter=null,$datas=null) { + static $_PUT = null; + if(strpos($name,'/')){ // 指定修饰符 + list($name,$type) = explode('/',$name,2); + }elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串 + $type = 's'; + } + if(strpos($name,'.')) { // 指定参数来源 + list($method,$name) = explode('.',$name,2); + }else{ // 默认为自动判断 + $method = 'param'; + } + switch(strtolower($method)) { + case 'get' : + $input =& $_GET; + break; + case 'post' : + $input =& $_POST; + break; + case 'put' : + if(is_null($_PUT)){ + parse_str(file_get_contents('php://input'), $_PUT); + } + $input = $_PUT; + break; + case 'param' : + switch($_SERVER['REQUEST_METHOD']) { + case 'POST': + $input = $_POST; + break; + case 'PUT': + if(is_null($_PUT)){ + parse_str(file_get_contents('php://input'), $_PUT); + } + $input = $_PUT; + break; + default: + $input = $_GET; + } + break; + case 'path' : + $input = array(); + if(!empty($_SERVER['PATH_INFO'])){ + $depr = C('URL_PATHINFO_DEPR'); + $input = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); + } + break; + case 'request' : + $input =& $_REQUEST; + break; + case 'session' : + $input =& $_SESSION; + break; + case 'cookie' : + $input =& $_COOKIE; + break; + case 'server' : + $input =& $_SERVER; + break; + case 'globals' : + $input =& $GLOBALS; + break; + case 'data' : + $input =& $datas; + break; + default: + return null; + } + if(''==$name) { // 获取全部变量 + $data = $input; + $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); + if($filters) { + if(is_string($filters)){ + $filters = explode(',',$filters); + } + foreach($filters as $filter){ + $data = array_map_recursive($filter,$data); // 参数过滤 + } + } + }elseif(isset($input[$name])) { // 取值操作 + $data = $input[$name]; + $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); + if($filters) { + if(is_string($filters)){ + if(0 === strpos($filters,'/')){ + if(1 !== preg_match($filters,(string)$data)){ + // 支持正则验证 + return isset($default) ? $default : null; + } + }else{ + $filters = explode(',',$filters); + } + }elseif(is_int($filters)){ + $filters = array($filters); + } + + if(is_array($filters)){ + foreach($filters as $filter){ + if(function_exists($filter)) { + $data = is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤 + }else{ + $data = filter_var($data,is_int($filter) ? $filter : filter_id($filter)); + if(false === $data) { + return isset($default) ? $default : null; + } + } + } + } + } + if(!empty($type)){ + switch(strtolower($type)){ + case 'a': // 数组 + $data = (array)$data; + break; + case 'd': // 数字 + $data = (int)$data; + break; + case 'f': // 浮点 + $data = (float)$data; + break; + case 'b': // 布尔 + $data = (boolean)$data; + break; + case 's': // 字符串 + default: + $data = (string)$data; + } + } + }else{ // 变量默认值 + $data = isset($default)?$default:null; + } + is_array($data) && array_walk_recursive($data,'think_filter'); + return $data; +} + +function array_map_recursive($filter, $data) { + $result = array(); + foreach ($data as $key => $val) { + $result[$key] = is_array($val) + ? array_map_recursive($filter, $val) + : call_user_func($filter, $val); + } + return $result; + } + +/** + * 设置和获取统计数据 + * 使用方法: + * <code> + * N('db',1); // 记录数据库操作次数 + * N('read',1); // 记录读取次数 + * echo N('db'); // 获取当前页面数据库的所有操作次数 + * echo N('read'); // 获取当前页面读取次数 + * </code> + * @param string $key 标识位置 + * @param integer $step 步进值 + * @param boolean $save 是否保存结果 + * @return mixed + */ +function N($key, $step=0,$save=false) { + static $_num = array(); + if (!isset($_num[$key])) { + $_num[$key] = (false !== $save)? S('N_'.$key) : 0; + } + if (empty($step)){ + return $_num[$key]; + }else{ + $_num[$key] = $_num[$key] + (int)$step; + } + if(false !== $save){ // 保存结果 + S('N_'.$key,$_num[$key],$save); + } + return null; +} + +/** + * 字符串命名风格转换 + * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格 + * @param string $name 字符串 + * @param integer $type 转换类型 + * @return string + */ +function parse_name($name, $type=0) { + if ($type) { + return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name)); + } else { + return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_")); + } +} + +/** + * 优化的require_once + * @param string $filename 文件地址 + * @return boolean + */ +function require_cache($filename) { + static $_importFiles = array(); + if (!isset($_importFiles[$filename])) { + if (file_exists_case($filename)) { + require $filename; + $_importFiles[$filename] = true; + } else { + $_importFiles[$filename] = false; + } + } + return $_importFiles[$filename]; +} + +/** + * 区分大小写的文件存在判断 + * @param string $filename 文件地址 + * @return boolean + */ +function file_exists_case($filename) { + if (is_file($filename)) { + if (IS_WIN && APP_DEBUG) { + if (basename(realpath($filename)) != basename($filename)) + return false; + } + return true; + } + return false; +} + +/** + * 导入所需的类库 同java的Import 本函数有缓存功能 + * @param string $class 类库命名空间字符串 + * @param string $baseUrl 起始路径 + * @param string $ext 导入的文件扩展名 + * @return boolean + */ +function import($class, $baseUrl = '', $ext=EXT) { + static $_file = array(); + $class = str_replace(array('.', '#'), array('/', '.'), $class); + if (isset($_file[$class . $baseUrl])) + return true; + else + $_file[$class . $baseUrl] = true; + $class_strut = explode('/', $class); + if (empty($baseUrl)) { + if ('@' == $class_strut[0] || MODULE_NAME == $class_strut[0]) { + //加载当前模块的类库 + $baseUrl = MODULE_PATH; + $class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1); + }elseif ('Common' == $class_strut[0]) { + //加载公共模块的类库 + $baseUrl = COMMON_PATH; + $class = substr($class, 7); + }elseif (in_array($class_strut[0],array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$class_strut[0])) { + // 系统类库包和第三方类库包 + $baseUrl = LIB_PATH; + }else { // 加载其他模块的类库 + $baseUrl = APP_PATH; + } + } + if (substr($baseUrl, -1) != '/') + $baseUrl .= '/'; + $classfile = $baseUrl . $class . $ext; + if (!class_exists(basename($class),false)) { + // 如果类不存在 则导入类库文件 + return require_cache($classfile); + } + return null; +} + +/** + * 基于命名空间方式导入函数库 + * load('@.Util.Array') + * @param string $name 函数库命名空间字符串 + * @param string $baseUrl 起始路径 + * @param string $ext 导入的文件扩展名 + * @return void + */ +function load($name, $baseUrl='', $ext='.php') { + $name = str_replace(array('.', '#'), array('/', '.'), $name); + if (empty($baseUrl)) { + if (0 === strpos($name, '@/')) {//加载当前模块函数库 + $baseUrl = MODULE_PATH.'Common/'; + $name = substr($name, 2); + } else { //加载其他模块函数库 + $array = explode('/', $name); + $baseUrl = APP_PATH . array_shift($array).'/Common/'; + $name = implode('/',$array); + } + } + if (substr($baseUrl, -1) != '/') + $baseUrl .= '/'; + require_cache($baseUrl . $name . $ext); +} + +/** + * 快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面 + * @param string $class 类库 + * @param string $baseUrl 基础目录 + * @param string $ext 类库后缀 + * @return boolean + */ +function vendor($class, $baseUrl = '', $ext='.php') { + if (empty($baseUrl)) + $baseUrl = VENDOR_PATH; + return import($class, $baseUrl, $ext); +} + +/** + * 实例化模型类 格式 [资源://][模块/]模型 + * @param string $name 资源地址 + * @param string $layer 模型层名称 + * @return Think\Model + */ +function D($name='',$layer='') { + if(empty($name)) return new Think\Model; + static $_model = array(); + $layer = $layer? : C('DEFAULT_M_LAYER'); + if(isset($_model[$name.$layer])) + return $_model[$name.$layer]; + $class = parse_res_name($name,$layer); + if(class_exists($class)) { + $model = new $class(basename($name)); + }elseif(false === strpos($name,'/')){ + // 自动加载公共模块下面的模型 + if(!C('APP_USE_NAMESPACE')){ + import('Common/'.$layer.'/'.$class); + }else{ + $class = '\\Common\\'.$layer.'\\'.$name.$layer; + } + $model = class_exists($class)? new $class($name) : new Think\Model($name); + }else { + Think\Log::record('D方法实例化没找到模型类'.$class,Think\Log::NOTICE); + $model = new Think\Model(basename($name)); + } + $_model[$name.$layer] = $model; + return $model; +} + +/** + * 实例化一个没有模型文件的Model + * @param string $name Model名称 支持指定基础模型 例如 MongoModel:User + * @param string $tablePrefix 表前缀 + * @param mixed $connection 数据库连接信息 + * @return Think\Model + */ +function M($name='', $tablePrefix='',$connection='') { + static $_model = array(); + if(strpos($name,':')) { + list($class,$name) = explode(':',$name); + }else{ + $class = 'Think\\Model'; + } + $guid = (is_array($connection)?implode('',$connection):$connection).$tablePrefix . $name . '_' . $class; + if (!isset($_model[$guid])) + $_model[$guid] = new $class($name,$tablePrefix,$connection); + return $_model[$guid]; +} + +/** + * 解析资源地址并导入类库文件 + * 例如 module/controller addon://module/behavior + * @param string $name 资源地址 格式:[扩展://][模块/]资源名 + * @param string $layer 分层名称 + * @param integer $level 控制器层次 + * @return string + */ +function parse_res_name($name,$layer,$level=1){ + if(strpos($name,'://')) {// 指定扩展资源 + list($extend,$name) = explode('://',$name); + }else{ + $extend = ''; + } + if(strpos($name,'/') && substr_count($name, '/')>=$level){ // 指定模块 + list($module,$name) = explode('/',$name,2); + }else{ + $module = defined('MODULE_NAME') ? MODULE_NAME : '' ; + } + $array = explode('/',$name); + if(!C('APP_USE_NAMESPACE')){ + $class = parse_name($name, 1); + import($module.'/'.$layer.'/'.$class.$layer); + }else{ + $class = $module.'\\'.$layer; + foreach($array as $name){ + $class .= '\\'.parse_name($name, 1); + } + // 导入资源类库 + if($extend){ // 扩展资源 + $class = $extend.'\\'.$class; + } + } + return $class.$layer; +} + +/** + * 用于实例化访问控制器 + * @param string $name 控制器名 + * @param string $path 控制器命名空间(路径) + * @return Think\Controller|false + */ +function controller($name,$path=''){ + $layer = C('DEFAULT_C_LAYER'); + if(!C('APP_USE_NAMESPACE')){ + $class = parse_name($name, 1).$layer; + import(MODULE_NAME.'/'.$layer.'/'.$class); + }else{ + $class = ( $path ? basename(ADDON_PATH).'\\'.$path : MODULE_NAME ).'\\'.$layer; + $array = explode('/',$name); + foreach($array as $name){ + $class .= '\\'.parse_name($name, 1); + } + $class .= $layer; + } + if(class_exists($class)) { + return new $class(); + }else { + return false; + } +} + +/** + * 实例化多层控制器 格式:[资源://][模块/]控制器 + * @param string $name 资源地址 + * @param string $layer 控制层名称 + * @param integer $level 控制器层次 + * @return Think\Controller|false + */ +function A($name,$layer='',$level=0) { + static $_action = array(); + $layer = $layer? : C('DEFAULT_C_LAYER'); + $level = $level? : ($layer == C('DEFAULT_C_LAYER')?C('CONTROLLER_LEVEL'):1); + if(isset($_action[$name.$layer])) + return $_action[$name.$layer]; + + $class = parse_res_name($name,$layer,$level); + if(class_exists($class)) { + $action = new $class(); + $_action[$name.$layer] = $action; + return $action; + }else { + return false; + } +} + + +/** + * 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作 + * @param string $url 调用地址 + * @param string|array $vars 调用参数 支持字符串和数组 + * @param string $layer 要调用的控制层名称 + * @return mixed + */ +function R($url,$vars=array(),$layer='') { + $info = pathinfo($url); + $action = $info['basename']; + $module = $info['dirname']; + $class = A($module,$layer); + if($class){ + if(is_string($vars)) { + parse_str($vars,$vars); + } + return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars); + }else{ + return false; + } +} + +/** + * 处理标签扩展 + * @param string $tag 标签名称 + * @param mixed $params 传入参数 + * @return void + */ +function tag($tag, &$params=NULL) { + \Think\Hook::listen($tag,$params); +} + +/** + * 执行某个行为 + * @param string $name 行为名称 + * @param string $tag 标签名称(行为类无需传入) + * @param Mixed $params 传入的参数 + * @return void + */ +function B($name, $tag='',&$params=NULL) { + if(''==$tag){ + $name .= 'Behavior'; + } + return \Think\Hook::exec($name,$tag,$params); +} + +/** + * 去除代码中的空白和注释 + * @param string $content 代码内容 + * @return string + */ +function strip_whitespace($content) { + $stripStr = ''; + //分析php源码 + $tokens = token_get_all($content); + $last_space = false; + for ($i = 0, $j = count($tokens); $i < $j; $i++) { + if (is_string($tokens[$i])) { + $last_space = false; + $stripStr .= $tokens[$i]; + } else { + switch ($tokens[$i][0]) { + //过滤各种PHP注释 + case T_COMMENT: + case T_DOC_COMMENT: + break; + //过滤空格 + case T_WHITESPACE: + if (!$last_space) { + $stripStr .= ' '; + $last_space = true; + } + break; + case T_START_HEREDOC: + $stripStr .= "<<<THINK\n"; + break; + case T_END_HEREDOC: + $stripStr .= "THINK;\n"; + for($k = $i+1; $k < $j; $k++) { + if(is_string($tokens[$k]) && $tokens[$k] == ';') { + $i = $k; + break; + } else if($tokens[$k][0] == T_CLOSE_TAG) { + break; + } + } + break; + default: + $last_space = false; + $stripStr .= $tokens[$i][1]; + } + } + } + return $stripStr; +} + +/** + * 自定义异常处理 + * @param string $msg 异常消息 + * @param string $type 异常类型 默认为Think\Exception + * @param integer $code 异常代码 默认为0 + * @return void + */ +function throw_exception($msg, $type='Think\\Exception', $code=0) { + Think\Log::record('建议使用E方法替代throw_exception',Think\Log::NOTICE); + if (class_exists($type, false)) + throw new $type($msg, $code); + else + Think\Think::halt($msg); // 异常类型不存在则输出错误信息字串 +} + +/** + * 浏览器友好的变量输出 + * @param mixed $var 变量 + * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串 + * @param string $label 标签 默认为空 + * @param boolean $strict 是否严谨 默认为true + * @return void|string + */ +function dump($var, $echo=true, $label=null, $strict=true) { + $label = ($label === null) ? '' : rtrim($label) . ' '; + if (!$strict) { + if (ini_get('html_errors')) { + $output = print_r($var, true); + $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>'; + } else { + $output = $label . print_r($var, true); + } + } else { + ob_start(); + var_dump($var); + $output = ob_get_clean(); + if (!extension_loaded('xdebug')) { + $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); + $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>'; + } + } + if ($echo) { + echo($output); + return null; + }else + return $output; +} + +/** + * 设置当前页面的布局 + * @param string|false $layout 布局名称 为false的时候表示关闭布局 + * @return void + */ +function layout($layout) { + if(false !== $layout) { + // 开启布局 + C('LAYOUT_ON',true); + if(is_string($layout)) { // 设置新的布局模板 + C('LAYOUT_NAME',$layout); + } + }else{// 临时关闭布局 + C('LAYOUT_ON',false); + } +} + +/** + * URL组装 支持不同URL模式 + * @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...' + * @param string|array $vars 传入的参数,支持数组和字符串 + * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值 + * @param boolean $domain 是否显示域名 + * @return string + */ +function U($url='',$vars='',$suffix=true,$domain=false) { + // 解析URL + $info = parse_url($url); + $url = !empty($info['path'])?$info['path']:ACTION_NAME; + if(isset($info['fragment'])) { // 解析锚点 + $anchor = $info['fragment']; + if(false !== strpos($anchor,'?')) { // 解析参数 + list($anchor,$info['query']) = explode('?',$anchor,2); + } + if(false !== strpos($anchor,'@')) { // 解析域名 + list($anchor,$host) = explode('@',$anchor, 2); + } + }elseif(false !== strpos($url,'@')) { // 解析域名 + list($url,$host) = explode('@',$info['path'], 2); + } + // 解析子域名 + if(isset($host)) { + $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.')); + }elseif($domain===true){ + $domain = $_SERVER['HTTP_HOST']; + if(C('APP_SUB_DOMAIN_DEPLOY') ) { // 开启子域名部署 + $domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.'); + // '子域名'=>array('模块[/控制器]'); + foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) { + $rule = is_array($rule)?$rule[0]:$rule; + if(false === strpos($key,'*') && 0=== strpos($url,$rule)) { + $domain = $key.strstr($domain,'.'); // 生成对应子域名 + $url = substr_replace($url,'',0,strlen($rule)); + break; + } + } + } + } + + // 解析参数 + if(is_string($vars)) { // aaa=1&bbb=2 转换成数组 + parse_str($vars,$vars); + }elseif(!is_array($vars)){ + $vars = array(); + } + if(isset($info['query'])) { // 解析地址里面参数 合并到vars + parse_str($info['query'],$params); + $vars = array_merge($params,$vars); + } + + // URL组装 + $depr = C('URL_PATHINFO_DEPR'); + $urlCase = C('URL_CASE_INSENSITIVE'); + if($url) { + if(0=== strpos($url,'/')) {// 定义路由 + $route = true; + $url = substr($url,1); + if('/' != $depr) { + $url = str_replace('/',$depr,$url); + } + }else{ + if('/' != $depr) { // 安全替换 + $url = str_replace('/',$depr,$url); + } + // 解析模块、控制器和操作 + $url = trim($url,$depr); + $path = explode($depr,$url); + $var = array(); + $varModule = C('VAR_MODULE'); + $varController = C('VAR_CONTROLLER'); + $varAction = C('VAR_ACTION'); + $var[$varAction] = !empty($path)?array_pop($path):ACTION_NAME; + $var[$varController] = !empty($path)?array_pop($path):CONTROLLER_NAME; + if($maps = C('URL_ACTION_MAP')) { + if(isset($maps[strtolower($var[$varController])])) { + $maps = $maps[strtolower($var[$varController])]; + if($action = array_search(strtolower($var[$varAction]),$maps)){ + $var[$varAction] = $action; + } + } + } + if($maps = C('URL_CONTROLLER_MAP')) { + if($controller = array_search(strtolower($var[$varController]),$maps)){ + $var[$varController] = $controller; + } + } + if($urlCase) { + $var[$varController] = parse_name($var[$varController]); + } + $module = ''; + + if(!empty($path)) { + $var[$varModule] = implode($depr,$path); + }else{ + if(C('MULTI_MODULE')) { + if(MODULE_NAME != C('DEFAULT_MODULE') || !C('MODULE_ALLOW_LIST')){ + $var[$varModule]= MODULE_NAME; + } + } + } + if($maps = C('URL_MODULE_MAP')) { + if($_module = array_search(strtolower($var[$varModule]),$maps)){ + $var[$varModule] = $_module; + } + } + if(isset($var[$varModule])){ + $module = $var[$varModule]; + unset($var[$varModule]); + } + + } + } + + if(C('URL_MODEL') == 0) { // 普通模式URL转换 + $url = __APP__.'?'.C('VAR_MODULE')."={$module}&".http_build_query(array_reverse($var)); + if($urlCase){ + $url = strtolower($url); + } + if(!empty($vars)) { + $vars = http_build_query($vars); + $url .= '&'.$vars; + } + }else{ // PATHINFO模式或者兼容URL模式 + if(isset($route)) { + $url = __APP__.'/'.rtrim($url,$depr); + }else{ + $module = (defined('BIND_MODULE') && BIND_MODULE==$module )? '' : $module; + $url = __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var)); + } + if($urlCase){ + $url = strtolower($url); + } + if(!empty($vars)) { // 添加参数 + foreach ($vars as $var => $val){ + if('' !== trim($val)) $url .= $depr . $var . $depr . urlencode($val); + } + } + if($suffix) { + $suffix = $suffix===true?C('URL_HTML_SUFFIX'):$suffix; + if($pos = strpos($suffix, '|')){ + $suffix = substr($suffix, 0, $pos); + } + if($suffix && '/' != substr($url,-1)){ + $url .= '.'.ltrim($suffix,'.'); + } + } + } + if(isset($anchor)){ + $url .= '#'.$anchor; + } + if($domain) { + $url = (is_ssl()?'https://':'http://').$domain.$url; + } + return $url; +} + +/** + * 渲染输出Widget + * @param string $name Widget名称 + * @param array $data 传入的参数 + * @return void + */ +function W($name, $data=array()) { + return R($name,$data,'Widget'); +} + +/** + * 判断是否SSL协议 + * @return boolean + */ +function is_ssl() { + if(isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))){ + return true; + }elseif(isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'] )) { + return true; + } + return false; +} + +/** + * URL重定向 + * @param string $url 重定向的URL地址 + * @param integer $time 重定向的等待时间(秒) + * @param string $msg 重定向前的提示信息 + * @return void + */ +function redirect($url, $time=0, $msg='') { + //多行URL地址支持 + $url = str_replace(array("\n", "\r"), '', $url); + if (empty($msg)) + $msg = "系统将在{$time}秒之后自动跳转到{$url}!"; + if (!headers_sent()) { + // redirect + if (0 === $time) { + header('Location: ' . $url); + } else { + header("refresh:{$time};url={$url}"); + echo($msg); + } + exit(); + } else { + $str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>"; + if ($time != 0) + $str .= $msg; + exit($str); + } +} + +/** + * 缓存管理 + * @param mixed $name 缓存名称,如果为数组表示进行缓存设置 + * @param mixed $value 缓存值 + * @param mixed $options 缓存参数 + * @return mixed + */ +function S($name,$value='',$options=null) { + static $cache = ''; + if(is_array($options)){ + // 缓存操作的同时初始化 + $type = isset($options['type'])?$options['type']:''; + $cache = Think\Cache::getInstance($type,$options); + }elseif(is_array($name)) { // 缓存初始化 + $type = isset($name['type'])?$name['type']:''; + $cache = Think\Cache::getInstance($type,$name); + return $cache; + }elseif(empty($cache)) { // 自动初始化 + $cache = Think\Cache::getInstance(); + } + if(''=== $value){ // 获取缓存 + return $cache->get($name); + }elseif(is_null($value)) { // 删除缓存 + return $cache->rm($name); + }else { // 缓存数据 + if(is_array($options)) { + $expire = isset($options['expire'])?$options['expire']:NULL; + }else{ + $expire = is_numeric($options)?$options:NULL; + } + return $cache->set($name, $value, $expire); + } +} + +/** + * 快速文件数据读取和保存 针对简单类型数据 字符串、数组 + * @param string $name 缓存名称 + * @param mixed $value 缓存值 + * @param string $path 缓存路径 + * @return mixed + */ +function F($name, $value='', $path=DATA_PATH) { + static $_cache = array(); + $filename = $path . $name . '.php'; + if ('' !== $value) { + if (is_null($value)) { + // 删除缓存 + if(false !== strpos($name,'*')){ + return false; // TODO + }else{ + unset($_cache[$name]); + return Think\Storage::unlink($filename,'F'); + } + } else { + Think\Storage::put($filename,serialize($value),'F'); + // 缓存数据 + $_cache[$name] = $value; + return null; + } + } + // 获取缓存数据 + if (isset($_cache[$name])) + return $_cache[$name]; + if (Think\Storage::has($filename,'F')){ + $value = unserialize(Think\Storage::read($filename,'F')); + $_cache[$name] = $value; + } else { + $value = false; + } + return $value; +} + +/** + * 根据PHP各种类型变量生成唯一标识号 + * @param mixed $mix 变量 + * @return string + */ +function to_guid_string($mix) { + if (is_object($mix)) { + return spl_object_hash($mix); + } elseif (is_resource($mix)) { + $mix = get_resource_type($mix) . strval($mix); + } else { + $mix = serialize($mix); + } + return md5($mix); +} + +/** + * XML编码 + * @param mixed $data 数据 + * @param string $root 根节点名 + * @param string $item 数字索引的子节点名 + * @param string $attr 根节点属性 + * @param string $id 数字索引子节点key转换的属性名 + * @param string $encoding 数据编码 + * @return string + */ +function xml_encode($data, $root='think', $item='item', $attr='', $id='id', $encoding='utf-8') { + if(is_array($attr)){ + $_attr = array(); + foreach ($attr as $key => $value) { + $_attr[] = "{$key}=\"{$value}\""; + } + $attr = implode(' ', $_attr); + } + $attr = trim($attr); + $attr = empty($attr) ? '' : " {$attr}"; + $xml = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>"; + $xml .= "<{$root}{$attr}>"; + $xml .= data_to_xml($data, $item, $id); + $xml .= "</{$root}>"; + return $xml; +} + +/** + * 数据XML编码 + * @param mixed $data 数据 + * @param string $item 数字索引时的节点名称 + * @param string $id 数字索引key转换为的属性名 + * @return string + */ +function data_to_xml($data, $item='item', $id='id') { + $xml = $attr = ''; + foreach ($data as $key => $val) { + if(is_numeric($key)){ + $id && $attr = " {$id}=\"{$key}\""; + $key = $item; + } + $xml .= "<{$key}{$attr}>"; + $xml .= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : $val; + $xml .= "</{$key}>"; + } + return $xml; +} + +/** + * session管理函数 + * @param string|array $name session名称 如果为数组则表示进行session设置 + * @param mixed $value session值 + * @return mixed + */ +function session($name='',$value='') { + $prefix = C('SESSION_PREFIX'); + if(is_array($name)) { // session初始化 在session_start 之前调用 + if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']); + if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){ + session_id($_REQUEST[C('VAR_SESSION_ID')]); + }elseif(isset($name['id'])) { + session_id($name['id']); + } + if('common' == APP_MODE){ // 其它模式可能不支持 + ini_set('session.auto_start', 0); + } + if(isset($name['name'])) session_name($name['name']); + if(isset($name['path'])) session_save_path($name['path']); + if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']); + if(isset($name['expire'])) { + ini_set('session.gc_maxlifetime', $name['expire']); + ini_set('session.cookie_lifetime', $name['expire']); + } + if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0); + if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0); + if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']); + if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']); + if(isset($name['type'])) C('SESSION_TYPE',$name['type']); + if(C('SESSION_TYPE')) { // 读取session驱动 + $type = C('SESSION_TYPE'); + $class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type)); + $hander = new $class(); + session_set_save_handler( + array(&$hander,"open"), + array(&$hander,"close"), + array(&$hander,"read"), + array(&$hander,"write"), + array(&$hander,"destroy"), + array(&$hander,"gc")); + } + // 启动session + if(C('SESSION_AUTO_START')) session_start(); + }elseif('' === $value){ + if(''===$name){ + // 获取全部的session + return $prefix ? $_SESSION[$prefix] : $_SESSION; + }elseif(0===strpos($name,'[')) { // session 操作 + if('[pause]'==$name){ // 暂停session + session_write_close(); + }elseif('[start]'==$name){ // 启动session + session_start(); + }elseif('[destroy]'==$name){ // 销毁session + $_SESSION = array(); + session_unset(); + session_destroy(); + }elseif('[regenerate]'==$name){ // 重新生成id + session_regenerate_id(); + } + }elseif(0===strpos($name,'?')){ // 检查session + $name = substr($name,1); + if(strpos($name,'.')){ // 支持数组 + list($name1,$name2) = explode('.',$name); + return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]); + }else{ + return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]); + } + }elseif(is_null($name)){ // 清空session + if($prefix) { + unset($_SESSION[$prefix]); + }else{ + $_SESSION = array(); + } + }elseif($prefix){ // 获取session + if(strpos($name,'.')){ + list($name1,$name2) = explode('.',$name); + return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null; + }else{ + return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null; + } + }else{ + if(strpos($name,'.')){ + list($name1,$name2) = explode('.',$name); + return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null; + }else{ + return isset($_SESSION[$name])?$_SESSION[$name]:null; + } + } + }elseif(is_null($value)){ // 删除session + if(strpos($name,'.')){ + list($name1,$name2) = explode('.',$name); + if($prefix){ + unset($_SESSION[$prefix][$name1][$name2]); + }else{ + unset($_SESSION[$name1][$name2]); + } + }else{ + if($prefix){ + unset($_SESSION[$prefix][$name]); + }else{ + unset($_SESSION[$name]); + } + } + }else{ // 设置session + if(strpos($name,'.')){ + list($name1,$name2) = explode('.',$name); + if($prefix){ + $_SESSION[$prefix][$name1][$name2] = $value; + }else{ + $_SESSION[$name1][$name2] = $value; + } + }else{ + if($prefix){ + $_SESSION[$prefix][$name] = $value; + }else{ + $_SESSION[$name] = $value; + } + } + } + return null; +} + +/** + * Cookie 设置、获取、删除 + * @param string $name cookie名称 + * @param mixed $value cookie值 + * @param mixed $option cookie参数 + * @return mixed + */ +function cookie($name='', $value='', $option=null) { + // 默认设置 + $config = array( + 'prefix' => C('COOKIE_PREFIX'), // cookie 名称前缀 + 'expire' => C('COOKIE_EXPIRE'), // cookie 保存时间 + 'path' => C('COOKIE_PATH'), // cookie 保存路径 + 'domain' => C('COOKIE_DOMAIN'), // cookie 有效域名 + 'secure' => C('COOKIE_SECURE'), // cookie 启用安全传输 + 'httponly' => C('COOKIE_HTTPONLY'), // httponly设置 + ); + // 参数设置(会覆盖黙认设置) + if (!is_null($option)) { + if (is_numeric($option)) + $option = array('expire' => $option); + elseif (is_string($option)) + parse_str($option, $option); + $config = array_merge($config, array_change_key_case($option)); + } + if(!empty($config['httponly'])){ + ini_set("session.cookie_httponly", 1); + } + // 清除指定前缀的所有cookie + if (is_null($name)) { + if (empty($_COOKIE)) + return null; + // 要删除的cookie前缀,不指定则删除config设置的指定前缀 + $prefix = empty($value) ? $config['prefix'] : $value; + if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回 + foreach ($_COOKIE as $key => $val) { + if (0 === stripos($key, $prefix)) { + setcookie($key, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']); + unset($_COOKIE[$key]); + } + } + } + return null; + }elseif('' === $name){ + // 获取全部的cookie + return $_COOKIE; + } + $name = $config['prefix'] . str_replace('.', '_', $name); + if ('' === $value) { + if(isset($_COOKIE[$name])){ + $value = $_COOKIE[$name]; + if(0===strpos($value,'think:')){ + $value = substr($value,6); + return array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true)); + }else{ + return $value; + } + }else{ + return null; + } + } else { + if (is_null($value)) { + setcookie($name, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']); + unset($_COOKIE[$name]); // 删除指定cookie + } else { + // 设置cookie + if(is_array($value)){ + $value = 'think:'.json_encode(array_map('urlencode',$value)); + } + $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0; + setcookie($name, $value, $expire, $config['path'], $config['domain'],$config['secure'],$config['httponly']); + $_COOKIE[$name] = $value; + } + } + return null; +} + +/** + * 加载动态扩展文件 + * @var string $path 文件路径 + * @return void + */ +function load_ext_file($path) { + // 加载自定义外部文件 + if($files = C('LOAD_EXT_FILE')) { + $files = explode(',',$files); + foreach ($files as $file){ + $file = $path.'Common/'.$file.'.php'; + if(is_file($file)) include $file; + } + } + // 加载自定义的动态配置文件 + if($configs = C('LOAD_EXT_CONFIG')) { + if(is_string($configs)) $configs = explode(',',$configs); + foreach ($configs as $key=>$config){ + $file = is_file($config)? $config : $path.'Conf/'.$config.CONF_EXT; + if(is_file($file)) { + is_numeric($key)?C(load_config($file)):C($key,load_config($file)); + } + } + } +} + +/** + * 获取客户端IP地址 + * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 + * @param boolean $adv 是否进行高级模式获取(有可能被伪装) + * @return mixed + */ +function get_client_ip($type = 0,$adv=false) { + $type = $type ? 1 : 0; + static $ip = NULL; + if ($ip !== NULL) return $ip[$type]; + if($adv){ + if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); + $pos = array_search('unknown',$arr); + if(false !== $pos) unset($arr[$pos]); + $ip = trim($arr[0]); + }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { + $ip = $_SERVER['HTTP_CLIENT_IP']; + }elseif (isset($_SERVER['REMOTE_ADDR'])) { + $ip = $_SERVER['REMOTE_ADDR']; + } + }elseif (isset($_SERVER['REMOTE_ADDR'])) { + $ip = $_SERVER['REMOTE_ADDR']; + } + // IP地址合法验证 + $long = sprintf("%u",ip2long($ip)); + $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); + return $ip[$type]; +} + +/** + * 发送HTTP状态 + * @param integer $code 状态码 + * @return void + */ +function send_http_status($code) { + static $_status = array( + // Informational 1xx + 100 => 'Continue', + 101 => 'Switching Protocols', + // Success 2xx + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + // Redirection 3xx + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Moved Temporarily ', // 1.1 + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + // 306 is deprecated but reserved + 307 => 'Temporary Redirect', + // Client Error 4xx + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + // Server Error 5xx + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 509 => 'Bandwidth Limit Exceeded' + ); + if(isset($_status[$code])) { + header('HTTP/1.1 '.$code.' '.$_status[$code]); + // 确保FastCGI模式下正常 + header('Status:'.$code.' '.$_status[$code]); + } +} + +function think_filter(&$value){ + // TODO 其他安全过滤 + + // 过滤查询特殊字符 + if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){ + $value .= ' '; + } +} + +// 不区分大小写的in_array实现 +function in_array_case($value,$array){ + return in_array(strtolower($value),array_map('strtolower',$array)); +} diff --git a/ThinkPHP/Conf/convention.php b/ThinkPHP/Conf/convention.php new file mode 100644 index 0000000..4061933 --- /dev/null +++ b/ThinkPHP/Conf/convention.php @@ -0,0 +1,167 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +/** + * ThinkPHP惯例配置文件 + * 该文件请不要修改,如果要覆盖惯例配置的值,可在应用配置文件中设定和惯例不符的配置项 + * 配置名称大小写任意,系统会统一转换成小写 + * 所有配置参数都可以在生效前动态改变 + */ +defined('THINK_PATH') or exit(); +return array( + /* 应用设定 */ + 'APP_USE_NAMESPACE' => true, // 应用类库是否使用命名空间 + 'APP_SUB_DOMAIN_DEPLOY' => false, // 是否开启子域名部署 + 'APP_SUB_DOMAIN_RULES' => array(), // 子域名部署规则 + 'APP_DOMAIN_SUFFIX' => '', // 域名后缀 如果是com.cn net.cn 之类的后缀必须设置 + 'ACTION_SUFFIX' => '', // 操作方法后缀 + 'MULTI_MODULE' => true, // 是否允许多模块 如果为false 则必须设置 DEFAULT_MODULE + 'MODULE_DENY_LIST' => array('Common','Runtime'), + 'CONTROLLER_LEVEL' => 1, + 'APP_AUTOLOAD_LAYER' => 'Controller,Model', // 自动加载的应用类库层 关闭APP_USE_NAMESPACE后有效 + 'APP_AUTOLOAD_PATH' => '', // 自动加载的路径 关闭APP_USE_NAMESPACE后有效 + + /* Cookie设置 */ + 'COOKIE_EXPIRE' => 0, // Cookie有效期 + 'COOKIE_DOMAIN' => '', // Cookie有效域名 + 'COOKIE_PATH' => '/', // Cookie路径 + 'COOKIE_PREFIX' => '', // Cookie前缀 避免冲突 + 'COOKIE_SECURE' => false, // Cookie安全传输 + 'COOKIE_HTTPONLY' => '', // Cookie httponly设置 + + /* 默认设定 */ + 'DEFAULT_M_LAYER' => 'Model', // 默认的模型层名称 + 'DEFAULT_C_LAYER' => 'Controller', // 默认的控制器层名称 + 'DEFAULT_V_LAYER' => 'View', // 默认的视图层名称 + 'DEFAULT_LANG' => 'zh-cn', // 默认语言 + 'DEFAULT_THEME' => '', // 默认模板主题名称 + 'DEFAULT_MODULE' => 'Home', // 默认模块 + 'DEFAULT_CONTROLLER' => 'Index', // 默认控制器名称 + 'DEFAULT_ACTION' => 'index', // 默认操作名称 + 'DEFAULT_CHARSET' => 'utf-8', // 默认输出编码 + 'DEFAULT_TIMEZONE' => 'PRC', // 默认时区 + 'DEFAULT_AJAX_RETURN' => 'JSON', // 默认AJAX 数据返回格式,可选JSON XML ... + 'DEFAULT_JSONP_HANDLER' => 'jsonpReturn', // 默认JSONP格式返回的处理方法 + 'DEFAULT_FILTER' => 'htmlspecialchars', // 默认参数过滤方法 用于I函数... + + /* 数据库设置 */ + 'DB_TYPE' => '', // 数据库类型 + 'DB_HOST' => '', // 服务器地址 + 'DB_NAME' => '', // 数据库名 + 'DB_USER' => '', // 用户名 + 'DB_PWD' => '', // 密码 + 'DB_PORT' => '', // 端口 + 'DB_PREFIX' => '', // 数据库表前缀 + 'DB_PARAMS' => array(), // 数据库连接参数 + 'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 + 'DB_FIELDS_CACHE' => true, // 启用字段缓存 + 'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8 + 'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'DB_RW_SEPARATE' => false, // 数据库读写是否分离 主从式有效 + 'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量 + 'DB_SLAVE_NO' => '', // 指定从服务器序号 + + /* 数据缓存设置 */ + 'DATA_CACHE_TIME' => 0, // 数据缓存有效期 0表示永久缓存 + 'DATA_CACHE_COMPRESS' => false, // 数据缓存是否压缩缓存 + 'DATA_CACHE_CHECK' => false, // 数据缓存是否校验缓存 + 'DATA_CACHE_PREFIX' => '', // 缓存前缀 + 'DATA_CACHE_TYPE' => 'File', // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator + 'DATA_CACHE_PATH' => TEMP_PATH,// 缓存路径设置 (仅对File方式缓存有效) + 'DATA_CACHE_KEY' => '', // 缓存文件KEY (仅对File方式缓存有效) + 'DATA_CACHE_SUBDIR' => false, // 使用子目录缓存 (自动根据缓存标识的哈希创建子目录) + 'DATA_PATH_LEVEL' => 1, // 子目录缓存级别 + + /* 错误设置 */ + 'ERROR_MESSAGE' => '页面错误!请稍后再试~',//错误显示信息,非调试模式有效 + 'ERROR_PAGE' => '', // 错误定向页面 + 'SHOW_ERROR_MSG' => false, // 显示错误信息 + 'TRACE_MAX_RECORD' => 100, // 每个级别的错误信息 最大记录数 + + /* 日志设置 */ + 'LOG_RECORD' => false, // 默认不记录日志 + 'LOG_TYPE' => 'File', // 日志记录类型 默认为文件方式 + 'LOG_LEVEL' => 'EMERG,ALERT,CRIT,ERR',// 允许记录的日志级别 + 'LOG_FILE_SIZE' => 2097152, // 日志文件大小限制 + 'LOG_EXCEPTION_RECORD' => false, // 是否记录异常信息日志 + + /* SESSION设置 */ + 'SESSION_AUTO_START' => true, // 是否自动开启Session + 'SESSION_OPTIONS' => array(), // session 配置数组 支持type name id path expire domain 等参数 + 'SESSION_TYPE' => '', // session hander类型 默认无需设置 除非扩展了session hander驱动 + 'SESSION_PREFIX' => '', // session 前缀 + //'VAR_SESSION_ID' => 'session_id', //sessionID的提交变量 + + /* 模板引擎设置 */ + 'TMPL_CONTENT_TYPE' => 'text/html', // 默认模板输出类型 + 'TMPL_ACTION_ERROR' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认错误跳转对应的模板文件 + 'TMPL_ACTION_SUCCESS' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认成功跳转对应的模板文件 + 'TMPL_EXCEPTION_FILE' => THINK_PATH.'Tpl/think_exception.tpl',// 异常页面的模板文件 + 'TMPL_DETECT_THEME' => false, // 自动侦测模板主题 + 'TMPL_TEMPLATE_SUFFIX' => '.html', // 默认模板文件后缀 + 'TMPL_FILE_DEPR' => '/', //模板文件CONTROLLER_NAME与ACTION_NAME之间的分割符 + // 布局设置 + 'TMPL_ENGINE_TYPE' => 'Think', // 默认模板引擎 以下设置仅对使用Think模板引擎有效 + 'TMPL_CACHFILE_SUFFIX' => '.php', // 默认模板缓存后缀 + 'TMPL_DENY_FUNC_LIST' => 'echo,exit', // 模板引擎禁用函数 + 'TMPL_DENY_PHP' => false, // 默认模板引擎是否禁用PHP原生代码 + 'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记 + 'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记 + 'TMPL_VAR_IDENTIFY' => 'array', // 模板变量识别。留空自动判断,参数为'obj'则表示对象 + 'TMPL_STRIP_SPACE' => true, // 是否去除模板文件里面的html空格与换行 + 'TMPL_CACHE_ON' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译 + 'TMPL_CACHE_PREFIX' => '', // 模板缓存前缀标识,可以动态改变 + 'TMPL_CACHE_TIME' => 0, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒) + 'TMPL_LAYOUT_ITEM' => '{__CONTENT__}', // 布局模板的内容替换标识 + 'LAYOUT_ON' => false, // 是否启用布局 + 'LAYOUT_NAME' => 'layout', // 当前布局名称 默认为layout + + // Think模板引擎标签库相关设定 + 'TAGLIB_BEGIN' => '<', // 标签库标签开始标记 + 'TAGLIB_END' => '>', // 标签库标签结束标记 + 'TAGLIB_LOAD' => true, // 是否使用内置标签库之外的其它标签库,默认自动检测 + 'TAGLIB_BUILD_IN' => 'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序 + 'TAGLIB_PRE_LOAD' => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔 + + /* URL设置 */ + 'URL_CASE_INSENSITIVE' => true, // 默认false 表示URL区分大小写 true则表示不区分大小写 + 'URL_MODEL' => 1, // URL访问模式,可选参数0、1、2、3,代表以下四种模式: + // 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE 模式); 3 (兼容模式) 默认为PATHINFO 模式 + 'URL_PATHINFO_DEPR' => '/', // PATHINFO模式下,各参数之间的分割符号 + 'URL_PATHINFO_FETCH' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', // 用于兼容判断PATH_INFO 参数的SERVER替代变量列表 + 'URL_REQUEST_URI' => 'REQUEST_URI', // 获取当前页面地址的系统变量 默认为REQUEST_URI + 'URL_HTML_SUFFIX' => 'html', // URL伪静态后缀设置 + 'URL_DENY_SUFFIX' => 'ico|png|gif|jpg', // URL禁止访问的后缀设置 + 'URL_PARAMS_BIND' => true, // URL变量绑定到Action方法参数 + 'URL_PARAMS_BIND_TYPE' => 0, // URL变量绑定的类型 0 按变量名绑定 1 按变量顺序绑定 + 'URL_PARAMS_FILTER' => false, // URL变量绑定过滤 + 'URL_PARAMS_FILTER_TYPE'=> '', // URL变量绑定过滤方法 如果为空 调用DEFAULT_FILTER + 'URL_ROUTER_ON' => false, // 是否开启URL路由 + 'URL_ROUTE_RULES' => array(), // 默认路由规则 针对模块 + 'URL_MAP_RULES' => array(), // URL映射定义规则 + + /* 系统变量名称设置 */ + 'VAR_MODULE' => 'm', // 默认模块获取变量 + 'VAR_ADDON' => 'addon', // 默认的插件控制器命名空间变量 + 'VAR_CONTROLLER' => 'c', // 默认控制器获取变量 + 'VAR_ACTION' => 'a', // 默认操作获取变量 + 'VAR_AJAX_SUBMIT' => 'ajax', // 默认的AJAX提交变量 + 'VAR_JSONP_HANDLER' => 'callback', + 'VAR_PATHINFO' => 's', // 兼容模式PATHINFO获取变量例如 ?s=/module/action/id/1 后面的参数取决于URL_PATHINFO_DEPR + 'VAR_TEMPLATE' => 't', // 默认模板切换变量 + 'VAR_AUTO_STRING' => false, // 输入变量是否自动强制转换为字符串 如果开启则数组变量需要手动传入变量修饰符获取变量 + + 'HTTP_CACHE_CONTROL' => 'private', // 网页缓存控制 + 'CHECK_APP_DIR' => true, // 是否检查应用目录是否创建 + 'FILE_UPLOAD_TYPE' => 'Local', // 文件上传方式 + 'DATA_CRYPT_TYPE' => 'Think', // 数据加密方式 + +); diff --git a/ThinkPHP/Conf/debug.php b/ThinkPHP/Conf/debug.php new file mode 100644 index 0000000..06674b9 --- /dev/null +++ b/ThinkPHP/Conf/debug.php @@ -0,0 +1,27 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +/** + * ThinkPHP 默认的调试模式配置文件 + */ +defined('THINK_PATH') or exit(); +// 调试模式下面默认设置 可以在应用配置目录下重新定义 debug.php 覆盖 +return array( + 'LOG_RECORD' => true, // 进行日志记录 + 'LOG_EXCEPTION_RECORD' => true, // 是否记录异常信息日志 + 'LOG_LEVEL' => 'EMERG,ALERT,CRIT,ERR,WARN,NOTIC,INFO,DEBUG,SQL', // 允许记录的日志级别 + 'DB_FIELDS_CACHE' => false, // 字段缓存信息 + 'DB_DEBUG' => true, // 开启调试模式 记录SQL日志 + 'TMPL_CACHE_ON' => false, // 是否开启模板编译缓存,设为false则每次都会重新编译 + 'TMPL_STRIP_SPACE' => false, // 是否去除模板文件里面的html空格与换行 + 'SHOW_ERROR_MSG' => true, // 显示错误信息 + 'URL_CASE_INSENSITIVE' => false, // URL区分大小写 +); \ No newline at end of file diff --git a/ThinkPHP/LICENSE.txt b/ThinkPHP/LICENSE.txt new file mode 100644 index 0000000..581f906 --- /dev/null +++ b/ThinkPHP/LICENSE.txt @@ -0,0 +1,32 @@ + +ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 +版权所有Copyright © 2006-2014 by ThinkPHP (http://thinkphp.cn) +All rights reserved。 +ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 + +Apache Licence是著名的非盈利开源组织Apache采用的协议。 +该协议和BSD类似,鼓励代码共享和尊重原作者的著作权, +允许代码修改,再作为开源或商业软件发布。需要满足 +的条件: +1. 需要给代码的用户一份Apache Licence ; +2. 如果你修改了代码,需要在被修改的文件中说明; +3. 在延伸的代码中(修改和有源代码衍生的代码中)需要 +带有原来代码中的协议,商标,专利声明和其他原来作者规 +定需要包含的说明; +4. 如果再发布的产品中包含一个Notice文件,则在Notice文 +件中需要带有本协议内容。你可以在Notice中增加自己的 +许可,但不可以表现为对Apache Licence构成更改。 +具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0 + +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. diff --git a/ThinkPHP/Lang/en-us.php b/ThinkPHP/Lang/en-us.php new file mode 100644 index 0000000..706b9da --- /dev/null +++ b/ThinkPHP/Lang/en-us.php @@ -0,0 +1,51 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +/** + * ThinkPHP English language package + */ +return array( + /* core language package */ + '_MODULE_NOT_EXIST_' => "Module can't be loaded", + '_CONTROLLER_NOT_EXIST_' => "Controller can't be loaded", + '_ERROR_ACTION_' => 'Illegal Action', + '_LANGUAGE_NOT_LOAD_' => "Can't load language package", + '_TEMPLATE_NOT_EXIST_' => "Template doesn't exist", + '_MODULE_' => 'Module', + '_ACTION_' => 'Action', + '_MODEL_NOT_EXIST_' => "Model can't be loaded", + '_VALID_ACCESS_' => 'No access', + '_XML_TAG_ERROR_' => 'XML tag syntax errors', + '_DATA_TYPE_INVALID_' => 'Illegal data objects!', + '_OPERATION_WRONG_' => 'Operation error occurs', + '_NOT_LOAD_DB_' => 'Unable to load the database', + '_NO_DB_DRIVER_' => 'Unable to load database driver', + '_NOT_SUPPORT_DB_' => 'The system is temporarily not support database', + '_NO_DB_CONFIG_' => 'Not define the database configuration', + '_NOT_SUPPORT_' => 'The system does not support', + '_CACHE_TYPE_INVALID_' => 'Unable to load the cache type', + '_FILE_NOT_WRITABLE_' => 'Directory (file) is not writable', + '_METHOD_NOT_EXIST_' => 'The method you requested does not exist!', + '_CLASS_NOT_EXIST_' => 'Instantiating a class does not exist!', + '_CLASS_CONFLICT_' => 'Class name conflicts', + '_TEMPLATE_ERROR_' => 'Template Engine errors', + '_CACHE_WRITE_ERROR_' => 'Cache file write failed!', + '_TAGLIB_NOT_EXIST_' => 'Tag library is not defined', + '_OPERATION_FAIL_' => 'Operation failed!', + '_OPERATION_SUCCESS_' => 'Operation succeed!', + '_SELECT_NOT_EXIST_' => 'Record does not exist!', + '_EXPRESS_ERROR_' => 'Expression errors', + '_TOKEN_ERROR_' => "Form's token errors", + '_RECORD_HAS_UPDATE_' => 'Record has been updated', + '_NOT_ALLOW_PHP_' => 'PHP codes are not allowed in the template', + '_PARAM_ERROR_' => 'Parameter error or undefined', + '_ERROR_QUERY_EXPRESS_' => 'Query express error', +); diff --git a/ThinkPHP/Lang/pt-br.php b/ThinkPHP/Lang/pt-br.php new file mode 100644 index 0000000..e0ef3fa --- /dev/null +++ b/ThinkPHP/Lang/pt-br.php @@ -0,0 +1,51 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: Daiane Azevedo <daianeaze16@gmail.com> +// +---------------------------------------------------------------------- + +/** + * ThinkPHP Portuguese language package + */ +return array( + /* core language package */ + '_MODULE_NOT_EXIST_' => "Módulo não pode ser carregado", + '_CONTROLLER_NOT_EXIST_' => "Controller não pode ser carregado", + '_ERROR_ACTION_' => 'Ação ilegal', + '_LANGUAGE_NOT_LOAD_' => "Não é possível carregar pacote da linguagem", + '_TEMPLATE_NOT_EXIST_' => "Template não existe", + '_MODULE_' => 'Módulo', + '_ACTION_' => 'Ação', + '_MODEL_NOT_EXIST_' => "Modelo não pode ser carregado", + '_VALID_ACCESS_' => 'Sem acesso', + '_XML_TAG_ERROR_' => 'Erro de sintaxe - XML tag', + '_DATA_TYPE_INVALID_' => 'Tipos de dados ilegais!', + '_OPERATION_WRONG_' => 'Erro na operação', + '_NOT_LOAD_DB_' => 'Impossível carregar banco de dados', + '_NO_DB_DRIVER_' => 'Impossível carregar driver do bando de dados', + '_NOT_SUPPORT_DB_' => 'Temporariamente sem suporte ao banco', + '_NO_DB_CONFIG_' => 'Não define a configuração do banco', + '_NOT_SUPPORT_' => 'O sistema não suporta', + '_CACHE_TYPE_INVALID_' => 'Impossível carregar o tipo de cache', + '_FILE_NOT_WRITABLE_' => 'Diretório (arquivo) não pode ser escrito', + '_METHOD_NOT_EXIST_' => 'O método solicitado não existe!', + '_CLASS_NOT_EXIST_' => 'Não existe instância da classe', + '_CLASS_CONFLICT_' => 'Conflitos com nome da classe', + '_TEMPLATE_ERROR_' => 'Erros na contrução do template', + '_CACHE_WRITE_ERROR_' => 'Escrita do arquivo de cache falhou!', + '_TAGLIB_NOT_EXIST_' => 'Biblioteca da tag não foi definida', + '_OPERATION_FAIL_' => 'Operação falhou!', + '_OPERATION_SUCCESS_' => 'Operação bem sucessida!', + '_SELECT_NOT_EXIST_' => 'Gravação não existe!', + '_EXPRESS_ERROR_' => 'Erros de expressão', + '_TOKEN_ERROR_' => 'Erro no token do formulário', + '_RECORD_HAS_UPDATE_' => 'Gravação não foi atualizada', + '_NOT_ALLOW_PHP_' => 'Código PHP não é permitido no template', + '_PARAM_ERROR_' => 'Parâmetro errado ou indefinido', + '_ERROR_QUERY_EXPRESS_' => 'Erros na expressão da query', +); diff --git a/ThinkPHP/Lang/zh-cn.php b/ThinkPHP/Lang/zh-cn.php new file mode 100644 index 0000000..57ef25b --- /dev/null +++ b/ThinkPHP/Lang/zh-cn.php @@ -0,0 +1,51 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +/** + * ThinkPHP 简体中文语言包 + */ +return array( + /* 核心语言变量 */ + '_MODULE_NOT_EXIST_' => '无法加载模块', + '_CONTROLLER_NOT_EXIST_' => '无法加载控制器', + '_ERROR_ACTION_' => '非法操作', + '_LANGUAGE_NOT_LOAD_' => '无法加载语言包', + '_TEMPLATE_NOT_EXIST_' => '模板不存在', + '_MODULE_' => '模块', + '_ACTION_' => '操作', + '_MODEL_NOT_EXIST_' => '模型不存在或者没有定义', + '_VALID_ACCESS_' => '没有权限', + '_XML_TAG_ERROR_' => 'XML标签语法错误', + '_DATA_TYPE_INVALID_' => '非法数据对象!', + '_OPERATION_WRONG_' => '操作出现错误', + '_NOT_LOAD_DB_' => '无法加载数据库', + '_NO_DB_DRIVER_' => '无法加载数据库驱动', + '_NOT_SUPPORT_DB_' => '系统暂时不支持数据库', + '_NO_DB_CONFIG_' => '没有定义数据库配置', + '_NOT_SUPPORT_' => '系统不支持', + '_CACHE_TYPE_INVALID_' => '无法加载缓存类型', + '_FILE_NOT_WRITABLE_' => '目录(文件)不可写', + '_METHOD_NOT_EXIST_' => '方法不存在!', + '_CLASS_NOT_EXIST_' => '实例化一个不存在的类!', + '_CLASS_CONFLICT_' => '类名冲突', + '_TEMPLATE_ERROR_' => '模板引擎错误', + '_CACHE_WRITE_ERROR_' => '缓存文件写入失败!', + '_TAGLIB_NOT_EXIST_' => '标签库未定义', + '_OPERATION_FAIL_' => '操作失败!', + '_OPERATION_SUCCESS_' => '操作成功!', + '_SELECT_NOT_EXIST_' => '记录不存在!', + '_EXPRESS_ERROR_' => '表达式错误', + '_TOKEN_ERROR_' => '表单令牌错误', + '_RECORD_HAS_UPDATE_' => '记录已经更新', + '_NOT_ALLOW_PHP_' => '模板禁用PHP代码', + '_PARAM_ERROR_' => '参数错误或者未定义', + '_ERROR_QUERY_EXPRESS_' => '错误的查询条件', +); diff --git a/ThinkPHP/Lang/zh-tw.php b/ThinkPHP/Lang/zh-tw.php new file mode 100644 index 0000000..327f334 --- /dev/null +++ b/ThinkPHP/Lang/zh-tw.php @@ -0,0 +1,51 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +/** + * ThinkPHP 繁体中文語言包 + */ +return array( + /* 核心語言變數 */ + '_MODULE_NOT_EXIST_' => '無法載入模組', + '_CONTROLLER_NOT_EXIST_' => '無法載入控制器', + '_ERROR_ACTION_' => '非法操作', + '_LANGUAGE_NOT_LOAD_' => '無法載入語言包', + '_TEMPLATE_NOT_EXIST_' => '模板不存在', + '_MODULE_' => '模組', + '_ACTION_' => '操作', + '_MODEL_NOT_EXIST_' => '模型不存在或者沒有定義', + '_VALID_ACCESS_' => '沒有權限', + '_XML_TAG_ERROR_' => 'XML標籤語法錯誤', + '_DATA_TYPE_INVALID_' => '非法資料物件!', + '_OPERATION_WRONG_' => '操作出現錯誤', + '_NOT_LOAD_DB_' => '無法載入資料庫', + '_NO_DB_DRIVER_' => '無法載入資料庫驅動', + '_NOT_SUPPORT_DB_' => '系統暫時不支援資料庫', + '_NO_DB_CONFIG_' => '沒有定義資料庫設定', + '_NOT_SUPPORT_' => '系統不支援', + '_CACHE_TYPE_INVALID_' => '無法載入快取類型', + '_FILE_NOT_WRITABLE_' => '目錄(檔案)不可寫', + '_METHOD_NOT_EXIST_' => '方法不存在!', + '_CLASS_NOT_EXIST_' => '實例化一個不存在的類別!', + '_CLASS_CONFLICT_' => '類別名稱衝突', + '_TEMPLATE_ERROR_' => '模板引擎錯誤', + '_CACHE_WRITE_ERROR_' => '快取檔案寫入失敗!', + '_TAGLIB_NOT_EXIST_' => '標籤庫未定義', + '_OPERATION_FAIL_' => '操作失敗!', + '_OPERATION_SUCCESS_' => '操作成功!', + '_SELECT_NOT_EXIST_' => '記錄不存在!', + '_EXPRESS_ERROR_' => '運算式錯誤', + '_TOKEN_ERROR_' => '表單權限錯誤', + '_RECORD_HAS_UPDATE_' => '記錄已經更新', + '_NOT_ALLOW_PHP_' => '模板禁用PHP代碼', + '_PARAM_ERROR_' => '參數錯誤或者未定義', + '_ERROR_QUERY_EXPRESS_' => '錯誤的查詢條件', +); diff --git a/ThinkPHP/Library/Behavior/BuildLiteBehavior.class.php b/ThinkPHP/Library/Behavior/BuildLiteBehavior.class.php new file mode 100644 index 0000000..5b8f9b8 --- /dev/null +++ b/ThinkPHP/Library/Behavior/BuildLiteBehavior.class.php @@ -0,0 +1,87 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +// 创建Lite运行文件 +// 可以替换框架入口文件运行 +// 建议绑定位置app_init +class BuildLiteBehavior { + public function run(&$params) { + if(!defined('BUILD_LITE_FILE')) return ; + $litefile = C('RUNTIME_LITE_FILE',null,RUNTIME_PATH.'lite.php'); + if(is_file($litefile)) return; + + $defs = get_defined_constants(TRUE); + $content = 'namespace {$GLOBALS[\'_beginTime\'] = microtime(TRUE);'; + if(MEMORY_LIMIT_ON) { + $content .= '$GLOBALS[\'_startUseMems\'] = memory_get_usage();'; + } + + // 生成数组定义 + unset($defs['user']['BUILD_LITE_FILE']); + $content .= $this->buildArrayDefine($defs['user']).'}'; + + // 读取编译列表文件 + $filelist = is_file(CONF_PATH.'lite.php')? + include CONF_PATH.'lite.php': + array( + THINK_PATH.'Common/functions.php', + COMMON_PATH.'Common/function.php', + CORE_PATH . 'Think'.EXT, + CORE_PATH . 'Hook'.EXT, + CORE_PATH . 'App'.EXT, + CORE_PATH . 'Dispatcher'.EXT, + CORE_PATH . 'Log'.EXT, + CORE_PATH . 'Log/Driver/File'.EXT, + CORE_PATH . 'Route'.EXT, + CORE_PATH . 'Controller'.EXT, + CORE_PATH . 'View'.EXT, + CORE_PATH . 'Storage'.EXT, + CORE_PATH . 'Storage/Driver/File'.EXT, + CORE_PATH . 'Exception'.EXT, + BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT, + BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT, + ); + + // 编译文件 + foreach ($filelist as $file){ + if(is_file($file)) { + $content .= compile($file); + } + } + + // 处理Think类的start方法 + $content = preg_replace('/\$runtimefile = RUNTIME_PATH(.+?)(if\(APP_STATUS)/','\2',$content,1); + $content .= "\nnamespace { Think\Think::addMap(".var_export(\Think\Think::getMap(),true).");"; + $content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(\Think\Hook::get(),true).');Think\Think::start();}'; + + // 生成运行Lite文件 + file_put_contents($litefile,strip_whitespace('<?php '.$content)); + } + + // 根据数组生成常量定义 + private function buildArrayDefine($array) { + $content = "\n"; + foreach ($array as $key => $val) { + $key = strtoupper($key); + $content .= 'defined(\'' . $key . '\') or '; + if (is_int($val) || is_float($val)) { + $content .= "define('" . $key . "'," . $val . ');'; + } elseif (is_bool($val)) { + $val = ($val) ? 'true' : 'false'; + $content .= "define('" . $key . "'," . $val . ');'; + } elseif (is_string($val)) { + $content .= "define('" . $key . "','" . addslashes($val) . "');"; + } + $content .= "\n"; + } + return $content; + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Behavior/CheckLangBehavior.class.php b/ThinkPHP/Library/Behavior/CheckLangBehavior.class.php new file mode 100644 index 0000000..c4d46a2 --- /dev/null +++ b/ThinkPHP/Library/Behavior/CheckLangBehavior.class.php @@ -0,0 +1,77 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +/** + * 语言检测 并自动加载语言包 + */ +class CheckLangBehavior { + + // 行为扩展的执行入口必须是run + public function run(&$params){ + // 检测语言 + $this->checkLanguage(); + } + + /** + * 语言检查 + * 检查浏览器支持语言,并自动加载语言包 + * @access private + * @return void + */ + private function checkLanguage() { + // 不开启语言包功能,仅仅加载框架语言文件直接返回 + if (!C('LANG_SWITCH_ON',null,false)){ + return; + } + $langSet = C('DEFAULT_LANG'); + $varLang = C('VAR_LANGUAGE',null,'l'); + $langList = C('LANG_LIST',null,'zh-cn'); + // 启用了语言包功能 + // 根据是否启用自动侦测设置获取语言选择 + if (C('LANG_AUTO_DETECT',null,true)){ + if(isset($_GET[$varLang])){ + $langSet = $_GET[$varLang];// url中设置了语言变量 + cookie('think_language',$langSet,3600); + }elseif(cookie('think_language')){// 获取上次用户的选择 + $langSet = cookie('think_language'); + }elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){// 自动侦测浏览器语言 + preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches); + $langSet = $matches[1]; + cookie('think_language',$langSet,3600); + } + if(false === stripos($langList,$langSet)) { // 非法语言参数 + $langSet = C('DEFAULT_LANG'); + } + } + // 定义当前语言 + define('LANG_SET',strtolower($langSet)); + + // 读取框架语言包 + $file = THINK_PATH.'Lang/'.LANG_SET.'.php'; + if(LANG_SET != C('DEFAULT_LANG') && is_file($file)) + L(include $file); + + // 读取应用公共语言包 + $file = LANG_PATH.LANG_SET.'.php'; + if(is_file($file)) + L(include $file); + + // 读取模块语言包 + $file = MODULE_PATH.'Lang/'.LANG_SET.'.php'; + if(is_file($file)) + L(include $file); + + // 读取当前控制器语言包 + $file = MODULE_PATH.'Lang/'.LANG_SET.'/'.strtolower(CONTROLLER_NAME).'.php'; + if (is_file($file)) + L(include $file); + } +} diff --git a/ThinkPHP/Library/Behavior/ContentReplaceBehavior.class.php b/ThinkPHP/Library/Behavior/ContentReplaceBehavior.class.php new file mode 100644 index 0000000..c572223 --- /dev/null +++ b/ThinkPHP/Library/Behavior/ContentReplaceBehavior.class.php @@ -0,0 +1,47 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +/** + * 系统行为扩展:模板内容输出替换 + */ +class ContentReplaceBehavior { + + // 行为扩展的执行入口必须是run + public function run(&$content){ + $content = $this->templateContentReplace($content); + } + + /** + * 模板内容替换 + * @access protected + * @param string $content 模板内容 + * @return string + */ + protected function templateContentReplace($content) { + // 系统默认的特殊变量替换 + $replace = array( + '__ROOT__' => __ROOT__, // 当前网站地址 + '__APP__' => __APP__, // 当前应用地址 + '__MODULE__' => __MODULE__, + '__ACTION__' => __ACTION__, // 当前操作地址 + '__SELF__' => htmlentities(__SELF__), // 当前页面地址 + '__CONTROLLER__'=> __CONTROLLER__, + '__URL__' => __CONTROLLER__, + '__PUBLIC__' => __ROOT__.'/Public',// 站点公共目录 + ); + // 允许用户自定义模板的字符串替换 + if(is_array(C('TMPL_PARSE_STRING')) ) + $replace = array_merge($replace,C('TMPL_PARSE_STRING')); + $content = str_replace(array_keys($replace),array_values($replace),$content); + return $content; + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Behavior/ParseTemplateBehavior.class.php b/ThinkPHP/Library/Behavior/ParseTemplateBehavior.class.php new file mode 100644 index 0000000..21b6853 --- /dev/null +++ b/ThinkPHP/Library/Behavior/ParseTemplateBehavior.class.php @@ -0,0 +1,95 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +use Think\Storage; +use Think\Think; +/** + * 系统行为扩展:模板解析 + */ +class ParseTemplateBehavior { + + // 行为扩展的执行入口必须是run + public function run(&$_data){ + $engine = strtolower(C('TMPL_ENGINE_TYPE')); + $_content = empty($_data['content'])?$_data['file']:$_data['content']; + $_data['prefix'] = !empty($_data['prefix'])?$_data['prefix']:C('TMPL_CACHE_PREFIX'); + if('think'==$engine){ // 采用Think模板引擎 + if((!empty($_data['content']) && $this->checkContentCache($_data['content'],$_data['prefix'])) + || $this->checkCache($_data['file'],$_data['prefix'])) { // 缓存有效 + //载入模版缓存文件 + Storage::load(C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX'),$_data['var']); + }else{ + $tpl = Think::instance('Think\\Template'); + // 编译并加载模板文件 + $tpl->fetch($_content,$_data['var'],$_data['prefix']); + } + }else{ + // 调用第三方模板引擎解析和输出 + if(strpos($engine,'\\')){ + $class = $engine; + }else{ + $class = 'Think\\Template\\Driver\\'.ucwords($engine); + } + if(class_exists($class)) { + $tpl = new $class; + $tpl->fetch($_content,$_data['var']); + }else { // 类没有定义 + E(L('_NOT_SUPPORT_').': ' . $class); + } + } + } + + /** + * 检查缓存文件是否有效 + * 如果无效则需要重新编译 + * @access public + * @param string $tmplTemplateFile 模板文件名 + * @return boolean + */ + protected function checkCache($tmplTemplateFile,$prefix='') { + if (!C('TMPL_CACHE_ON')) // 优先对配置设定检测 + return false; + $tmplCacheFile = C('CACHE_PATH').$prefix.md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX'); + if(!Storage::has($tmplCacheFile)){ + return false; + }elseif (filemtime($tmplTemplateFile) > Storage::get($tmplCacheFile,'mtime')) { + // 模板文件如果有更新则缓存需要更新 + return false; + }elseif (C('TMPL_CACHE_TIME') != 0 && time() > Storage::get($tmplCacheFile,'mtime')+C('TMPL_CACHE_TIME')) { + // 缓存是否在有效期 + return false; + } + // 开启布局模板 + if(C('LAYOUT_ON')) { + $layoutFile = THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX'); + if(filemtime($layoutFile) > Storage::get($tmplCacheFile,'mtime')) { + return false; + } + } + // 缓存有效 + return true; + } + + /** + * 检查缓存内容是否有效 + * 如果无效则需要重新编译 + * @access public + * @param string $tmplContent 模板内容 + * @return boolean + */ + protected function checkContentCache($tmplContent,$prefix='') { + if(Storage::has(C('CACHE_PATH').$prefix.md5($tmplContent).C('TMPL_CACHFILE_SUFFIX'))){ + return true; + }else{ + return false; + } + } +} diff --git a/ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php b/ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php new file mode 100644 index 0000000..ce167da --- /dev/null +++ b/ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php @@ -0,0 +1,117 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +use Think\Storage; +/** + * 系统行为扩展:静态缓存读取 + */ +class ReadHtmlCacheBehavior { + // 行为扩展的执行入口必须是run + public function run(&$params){ + // 开启静态缓存 + if(IS_GET && C('HTML_CACHE_ON')) { + $cacheTime = $this->requireHtmlCache(); + if( false !== $cacheTime && $this->checkHTMLCache(HTML_FILE_NAME,$cacheTime)) { //静态页面有效 + // 读取静态页面输出 + echo Storage::read(HTML_FILE_NAME,'html'); + exit(); + } + } + } + + // 判断是否需要静态缓存 + static private function requireHtmlCache() { + // 分析当前的静态规则 + $htmls = C('HTML_CACHE_RULES'); // 读取静态规则 + if(!empty($htmls)) { + $htmls = array_change_key_case($htmls); + // 静态规则文件定义格式 actionName=>array('静态规则','缓存时间','附加规则') + // 'read'=>array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性 + // 检测静态规则 + $controllerName = strtolower(CONTROLLER_NAME); + $actionName = strtolower(ACTION_NAME); + if(isset($htmls[$controllerName.':'.$actionName])) { + $html = $htmls[$controllerName.':'.$actionName]; // 某个控制器的操作的静态规则 + }elseif(isset($htmls[$controllerName.':'])){// 某个控制器的静态规则 + $html = $htmls[$controllerName.':']; + }elseif(isset($htmls[$actionName])){ + $html = $htmls[$actionName]; // 所有操作的静态规则 + }elseif(isset($htmls['*'])){ + $html = $htmls['*']; // 全局静态规则 + } + if(!empty($html)) { + // 解读静态规则 + $rule = is_array($html)?$html[0]:$html; + // 以$_开头的系统变量 + $callback = function($match){ + switch($match[1]){ + case '_GET': $var = $_GET[$match[2]]; break; + case '_POST': $var = $_POST[$match[2]]; break; + case '_REQUEST': $var = $_REQUEST[$match[2]]; break; + case '_SERVER': $var = $_SERVER[$match[2]]; break; + case '_SESSION': $var = $_SESSION[$match[2]]; break; + case '_COOKIE': $var = $_COOKIE[$match[2]]; break; + } + return (count($match) == 4) ? $match[3]($var) : $var; + }; + $rule = preg_replace_callback('/{\$(_\w+)\.(\w+)(?:\|(\w+))?}/', $callback, $rule); + // {ID|FUN} GET变量的简写 + $rule = preg_replace_callback('/{(\w+)\|(\w+)}/', function($match){return $match[2]($_GET[$match[1]]);}, $rule); + $rule = preg_replace_callback('/{(\w+)}/', function($match){return $_GET[$match[1]];}, $rule); + // 特殊系统变量 + $rule = str_ireplace( + array('{:controller}','{:action}','{:module}'), + array(CONTROLLER_NAME,ACTION_NAME,MODULE_NAME), + $rule); + // {|FUN} 单独使用函数 + $rule = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule); + $cacheTime = C('HTML_CACHE_TIME',null,60); + if(is_array($html)){ + if(!empty($html[2])) $rule = $html[2]($rule); // 应用附加函数 + $cacheTime = isset($html[1])?$html[1]:$cacheTime; // 缓存有效期 + }else{ + $cacheTime = $cacheTime; + } + + // 当前缓存文件 + define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX',null,'.html')); + return $cacheTime; + } + } + // 无需缓存 + return false; + } + + /** + * 检查静态HTML文件是否有效 + * 如果无效需要重新更新 + * @access public + * @param string $cacheFile 静态文件名 + * @param integer $cacheTime 缓存有效期 + * @return boolean + */ + static public function checkHTMLCache($cacheFile='',$cacheTime='') { + if(!is_file($cacheFile) && 'sae' != APP_MODE ){ + return false; + }elseif (filemtime(\Think\Think::instance('Think\View')->parseTemplate()) > Storage::get($cacheFile,'mtime','html')) { + // 模板文件如果更新静态文件需要更新 + return false; + }elseif(!is_numeric($cacheTime) && function_exists($cacheTime)){ + return $cacheTime($cacheFile); + }elseif ($cacheTime != 0 && NOW_TIME > Storage::get($cacheFile,'mtime','html')+$cacheTime) { + // 文件是否在有效期 + return false; + } + //静态文件有效 + return true; + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Behavior/ShowPageTraceBehavior.class.php b/ThinkPHP/Library/Behavior/ShowPageTraceBehavior.class.php new file mode 100644 index 0000000..4fc1197 --- /dev/null +++ b/ThinkPHP/Library/Behavior/ShowPageTraceBehavior.class.php @@ -0,0 +1,119 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +use Think\Log; +/** + * 系统行为扩展:页面Trace显示输出 + */ +class ShowPageTraceBehavior { + protected $tracePageTabs = array('BASE'=>'基本','FILE'=>'文件','INFO'=>'流程','ERR|NOTIC'=>'错误','SQL'=>'SQL','DEBUG'=>'调试'); + + // 行为扩展的执行入口必须是run + public function run(&$params){ + if(!IS_AJAX && !IS_CLI && C('SHOW_PAGE_TRACE')) { + echo $this->showTrace(); + } + } + + /** + * 显示页面Trace信息 + * @access private + */ + private function showTrace() { + // 系统默认显示信息 + $files = get_included_files(); + $info = array(); + foreach ($files as $key=>$file){ + $info[] = $file.' ( '.number_format(filesize($file)/1024,2).' KB )'; + } + $trace = array(); + $base = array( + '请求信息' => date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']).' '.$_SERVER['SERVER_PROTOCOL'].' '.$_SERVER['REQUEST_METHOD'].' : '.__SELF__, + '运行时间' => $this->showTime(), + '吞吐率' => number_format(1/G('beginTime','viewEndTime'),2).'req/s', + '内存开销' => MEMORY_LIMIT_ON?number_format((memory_get_usage() - $GLOBALS['_startUseMems'])/1024,2).' kb':'不支持', + '查询信息' => N('db_query').' queries '.N('db_write').' writes ', + '文件加载' => count(get_included_files()), + '缓存信息' => N('cache_read').' gets '.N('cache_write').' writes ', + '配置加载' => count(C()), + '会话信息' => 'SESSION_ID='.session_id(), + ); + // 读取应用定义的Trace文件 + $traceFile = COMMON_PATH.'Conf/trace.php'; + if(is_file($traceFile)) { + $base = array_merge($base,include $traceFile); + } + $debug = trace(); + $tabs = C('TRACE_PAGE_TABS',null,$this->tracePageTabs); + foreach ($tabs as $name=>$title){ + switch(strtoupper($name)) { + case 'BASE':// 基本信息 + $trace[$title] = $base; + break; + case 'FILE': // 文件信息 + $trace[$title] = $info; + break; + default:// 调试信息 + $name = strtoupper($name); + if(strpos($name,'|')) {// 多组信息 + $names = explode('|',$name); + $result = array(); + foreach($names as $name){ + $result += isset($debug[$name])?$debug[$name]:array(); + } + $trace[$title] = $result; + }else{ + $trace[$title] = isset($debug[$name])?$debug[$name]:''; + } + } + } + if($save = C('PAGE_TRACE_SAVE')) { // 保存页面Trace日志 + if(is_array($save)) {// 选择选项卡保存 + $tabs = C('TRACE_PAGE_TABS',null,$this->tracePageTabs); + $array = array(); + foreach ($save as $tab){ + $array[] = $tabs[$tab]; + } + } + $content = date('[ c ]').' '.get_client_ip().' '.$_SERVER['REQUEST_URI']."\r\n"; + foreach ($trace as $key=>$val){ + if(!isset($array) || in_array_case($key,$array)) { + $content .= '[ '.$key." ]\r\n"; + if(is_array($val)) { + foreach ($val as $k=>$v){ + $content .= (!is_numeric($k)?$k.':':'').print_r($v,true)."\r\n"; + } + }else{ + $content .= print_r($val,true)."\r\n"; + } + $content .= "\r\n"; + } + } + error_log(str_replace('<br/>',"\r\n",$content), 3,C('LOG_PATH').date('y_m_d').'_trace.log'); + } + unset($files,$info,$base); + // 调用Trace页面模板 + ob_start(); + include C('TMPL_TRACE_FILE')?C('TMPL_TRACE_FILE'):THINK_PATH.'Tpl/page_trace.tpl'; + return ob_get_clean(); + } + + /** + * 获取运行时间 + */ + private function showTime() { + // 显示运行时间 + G('beginTime',$GLOBALS['_beginTime']); + G('viewEndTime'); + // 显示详细运行时间 + return G('beginTime','viewEndTime').'s ( Load:'.G('beginTime','loadTime').'s Init:'.G('loadTime','initTime').'s Exec:'.G('initTime','viewStartTime').'s Template:'.G('viewStartTime','viewEndTime').'s )'; + } +} diff --git a/ThinkPHP/Library/Behavior/ShowRuntimeBehavior.class.php b/ThinkPHP/Library/Behavior/ShowRuntimeBehavior.class.php new file mode 100644 index 0000000..66360d3 --- /dev/null +++ b/ThinkPHP/Library/Behavior/ShowRuntimeBehavior.class.php @@ -0,0 +1,69 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +/** + * 系统行为扩展:运行时间信息显示 + */ +class ShowRuntimeBehavior { + + // 行为扩展的执行入口必须是run + public function run(&$content){ + if(C('SHOW_RUN_TIME')){ + if(false !== strpos($content,'{__NORUNTIME__}')) { + $content = str_replace('{__NORUNTIME__}','',$content); + }else{ + $runtime = $this->showTime(); + if(strpos($content,'{__RUNTIME__}')) + $content = str_replace('{__RUNTIME__}',$runtime,$content); + else + $content .= $runtime; + } + }else{ + $content = str_replace(array('{__NORUNTIME__}','{__RUNTIME__}'),'',$content); + } + } + + /** + * 显示运行时间、数据库操作、缓存次数、内存使用信息 + * @access private + * @return string + */ + private function showTime() { + // 显示运行时间 + G('beginTime',$GLOBALS['_beginTime']); + G('viewEndTime'); + $showTime = 'Process: '.G('beginTime','viewEndTime').'s '; + if(C('SHOW_ADV_TIME')) { + // 显示详细运行时间 + $showTime .= '( Load:'.G('beginTime','loadTime').'s Init:'.G('loadTime','initTime').'s Exec:'.G('initTime','viewStartTime').'s Template:'.G('viewStartTime','viewEndTime').'s )'; + } + if(C('SHOW_DB_TIMES') ) { + // 显示数据库操作次数 + $showTime .= ' | DB :'.N('db_query').' queries '.N('db_write').' writes '; + } + if(C('SHOW_CACHE_TIMES') ) { + // 显示缓存读写次数 + $showTime .= ' | Cache :'.N('cache_read').' gets '.N('cache_write').' writes '; + } + if(MEMORY_LIMIT_ON && C('SHOW_USE_MEM')) { + // 显示内存开销 + $showTime .= ' | UseMem:'. number_format((memory_get_usage() - $GLOBALS['_startUseMems'])/1024).' kb'; + } + if(C('SHOW_LOAD_FILE')) { + $showTime .= ' | LoadFile:'.count(get_included_files()); + } + if(C('SHOW_FUN_TIMES')) { + $fun = get_defined_functions(); + $showTime .= ' | CallFun:'.count($fun['user']).','.count($fun['internal']); + } + return $showTime; + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Behavior/TokenBuildBehavior.class.php b/ThinkPHP/Library/Behavior/TokenBuildBehavior.class.php new file mode 100644 index 0000000..6e7888a --- /dev/null +++ b/ThinkPHP/Library/Behavior/TokenBuildBehavior.class.php @@ -0,0 +1,54 @@ +<?php +// +---------------------------------------------------------------------- +// | TOPThink [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2010 http://topthink.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +/** + * 系统行为扩展:表单令牌生成 + */ +class TokenBuildBehavior { + + public function run(&$content){ + if(C('TOKEN_ON')) { + list($tokenName,$tokenKey,$tokenValue)=$this->getToken(); + $input_token = '<input type="hidden" name="'.$tokenName.'" value="'.$tokenKey.'_'.$tokenValue.'" />'; + $meta_token = '<meta name="'.$tokenName.'" content="'.$tokenKey.'_'.$tokenValue.'" />'; + if(strpos($content,'{__TOKEN__}')) { + // 指定表单令牌隐藏域位置 + $content = str_replace('{__TOKEN__}',$input_token,$content); + }elseif(preg_match('/<\/form(\s*)>/is',$content,$match)) { + // 智能生成表单令牌隐藏域 + $content = str_replace($match[0],$input_token.$match[0],$content); + } + $content = str_ireplace('</head>',$meta_token.'</head>',$content); + }else{ + $content = str_replace('{__TOKEN__}','',$content); + } + } + + //获得token + private function getToken(){ + $tokenName = C('TOKEN_NAME',null,'__hash__'); + $tokenType = C('TOKEN_TYPE',null,'md5'); + if(!isset($_SESSION[$tokenName])) { + $_SESSION[$tokenName] = array(); + } + // 标识当前页面唯一性 + $tokenKey = md5($_SERVER['REQUEST_URI']); + if(isset($_SESSION[$tokenName][$tokenKey])) {// 相同页面不重复生成session + $tokenValue = $_SESSION[$tokenName][$tokenKey]; + }else{ + $tokenValue = is_callable($tokenType) ? $tokenType(microtime(true)) : md5(microtime(true)); + $_SESSION[$tokenName][$tokenKey] = $tokenValue; + if(IS_AJAX && C('TOKEN_RESET',null,true)) + header($tokenName.': '.$tokenKey.'_'.$tokenValue); //ajax需要获得这个header并替换页面中meta中的token值 + } + return array($tokenName,$tokenKey,$tokenValue); + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Behavior/WriteHtmlCacheBehavior.class.php b/ThinkPHP/Library/Behavior/WriteHtmlCacheBehavior.class.php new file mode 100644 index 0000000..6248867 --- /dev/null +++ b/ThinkPHP/Library/Behavior/WriteHtmlCacheBehavior.class.php @@ -0,0 +1,29 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Behavior; +use Think\Storage; +/** + * 系统行为扩展:静态缓存写入 + */ +class WriteHtmlCacheBehavior { + + // 行为扩展的执行入口必须是run + public function run(&$content) { + //2014-11-28 修改 如果有HTTP 4xx 3xx 5xx 头部,禁止存储 + //2014-12-1 修改 对注入的网址 防止生成,例如 /game/lst/SortType/hot/-e8-90-8c-e5-85-94-e7-88-b1-e6-b6-88-e9-99-a4/-e8-bf-9b-e5-87-bb-e7-9a-84-e9-83-a8-e8-90-bd/-e9-a3-8e-e4-ba-91-e5-a4-a9-e4-b8-8b/index.shtml + if (C('HTML_CACHE_ON') && defined('HTML_FILE_NAME') + && !preg_match('/Status.*[345]{1}\d{2}/i', implode(' ', headers_list())) + && !preg_match('/(-[a-z0-9]{2}){3,}/i',HTML_FILE_NAME)) { + //静态文件写入 + Storage::put(HTML_FILE_NAME, $content, 'html'); + } + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/App.class.php b/ThinkPHP/Library/Think/App.class.php new file mode 100644 index 0000000..be15394 --- /dev/null +++ b/ThinkPHP/Library/Think/App.class.php @@ -0,0 +1,213 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP 应用程序类 执行应用过程管理 + */ +class App { + + /** + * 应用程序初始化 + * @access public + * @return void + */ + static public function init() { + // 加载动态应用公共文件和配置 + load_ext_file(COMMON_PATH); + + // 日志目录转换为绝对路径 默认情况下存储到公共模块下面 + C('LOG_PATH', realpath(LOG_PATH).'/Common/'); + + // 定义当前请求的系统常量 + define('NOW_TIME', $_SERVER['REQUEST_TIME']); + define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']); + define('IS_GET', REQUEST_METHOD =='GET' ? true : false); + define('IS_POST', REQUEST_METHOD =='POST' ? true : false); + define('IS_PUT', REQUEST_METHOD =='PUT' ? true : false); + define('IS_DELETE', REQUEST_METHOD =='DELETE' ? true : false); + + // URL调度 + Dispatcher::dispatch(); + + if(C('REQUEST_VARS_FILTER')){ + // 全局安全过滤 + array_walk_recursive($_GET, 'think_filter'); + array_walk_recursive($_POST, 'think_filter'); + array_walk_recursive($_REQUEST, 'think_filter'); + } + + // URL调度结束标签 + Hook::listen('url_dispatch'); + + define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')])) ? true : false); + + // TMPL_EXCEPTION_FILE 改为绝对地址 + C('TMPL_EXCEPTION_FILE',realpath(C('TMPL_EXCEPTION_FILE'))); + return ; + } + + /** + * 执行应用程序 + * @access public + * @return void + */ + static public function exec() { + + if(!preg_match('/^[A-Za-z](\/|\w)*$/',CONTROLLER_NAME)){ // 安全检测 + $module = false; + }elseif(C('ACTION_BIND_CLASS')){ + // 操作绑定到类:模块\Controller\控制器\操作 + $layer = C('DEFAULT_C_LAYER'); + if(is_dir(MODULE_PATH.$layer.'/'.CONTROLLER_NAME)){ + $namespace = MODULE_NAME.'\\'.$layer.'\\'.CONTROLLER_NAME.'\\'; + }else{ + // 空控制器 + $namespace = MODULE_NAME.'\\'.$layer.'\\_empty\\'; + } + $actionName = strtolower(ACTION_NAME); + if(class_exists($namespace.$actionName)){ + $class = $namespace.$actionName; + }elseif(class_exists($namespace.'_empty')){ + // 空操作 + $class = $namespace.'_empty'; + }else{ + E(L('_ERROR_ACTION_').':'.ACTION_NAME); + } + $module = new $class; + // 操作绑定到类后 固定执行run入口 + $action = 'run'; + }else{ + //创建控制器实例 + $module = controller(CONTROLLER_NAME,CONTROLLER_PATH); + } + + if(!$module) { + if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) { + header("Content-type:image/png"); + exit(base64_decode(App::logo())); + } + + // 是否定义Empty控制器 + $module = A('Empty'); + if(!$module){ + E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME); + } + } + + // 获取当前操作名 支持动态路由 + if(!isset($action)){ + $action = ACTION_NAME.C('ACTION_SUFFIX'); + } + try{ + self::invokeAction($module,$action); + } catch (\ReflectionException $e) { + // 方法调用发生异常后 引导到__call方法处理 + $method = new \ReflectionMethod($module,'__call'); + $method->invokeArgs($module,array($action,'')); + } + return ; + } + public static function invokeAction($module,$action){ + if(!preg_match('/^[A-Za-z](\w)*$/',$action)){ + // 非法操作 + throw new \ReflectionException(); + } + //执行当前操作 + $method = new \ReflectionMethod($module, $action); + if($method->isPublic() && !$method->isStatic()) { + $class = new \ReflectionClass($module); + // 前置操作 + if($class->hasMethod('_before_'.$action)) { + $before = $class->getMethod('_before_'.$action); + if($before->isPublic()) { + $before->invoke($module); + } + } + // URL参数绑定检测 + if($method->getNumberOfParameters()>0 && C('URL_PARAMS_BIND')){ + switch($_SERVER['REQUEST_METHOD']) { + case 'POST': + $vars = array_merge($_GET,$_POST); + break; + case 'PUT': + parse_str(file_get_contents('php://input'), $vars); + break; + default: + $vars = $_GET; + } + $params = $method->getParameters(); + $paramsBindType = C('URL_PARAMS_BIND_TYPE'); + foreach ($params as $param){ + $name = $param->getName(); + if( 1 == $paramsBindType && !empty($vars) ){ + $args[] = array_shift($vars); + }elseif( 0 == $paramsBindType && isset($vars[$name])){ + $args[] = $vars[$name]; + }elseif($param->isDefaultValueAvailable()){ + $args[] = $param->getDefaultValue(); + }else{ + E(L('_PARAM_ERROR_').':'.$name); + } + } + // 开启绑定参数过滤机制 + if(C('URL_PARAMS_SAFE')){ + $filters = C('URL_PARAMS_FILTER')?:C('DEFAULT_FILTER'); + if($filters) { + $filters = explode(',',$filters); + foreach($filters as $filter){ + $args = array_map_recursive($filter,$args); // 参数过滤 + } + } + } + array_walk_recursive($args,'think_filter'); + $method->invokeArgs($module,$args); + }else{ + $method->invoke($module); + } + // 后置操作 + if($class->hasMethod('_after_'.$action)) { + $after = $class->getMethod('_after_'.$action); + if($after->isPublic()) { + $after->invoke($module); + } + } + }else{ + // 操作方法不是Public 抛出异常 + throw new \ReflectionException(); + } + } + /** + * 运行应用实例 入口文件使用的快捷方法 + * @access public + * @return void + */ + static public function run() { + // 应用初始化标签 + Hook::listen('app_init'); + App::init(); + // 应用开始标签 + Hook::listen('app_begin'); + // Session初始化 + if(!IS_CLI){ + session(C('SESSION_OPTIONS')); + } + // 记录应用初始化时间 + G('initTime'); + App::exec(); + // 应用结束标签 + Hook::listen('app_end'); + return ; + } + + static public function logo(){ + return 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/9+69+8xuNtkHJAFCSIAkhMgjCCJQUi0GtEIVbP8Qq9LH2No6TmfaztjO2OnUdvqHFMfOVFTqIK0vUEEeqUBARCsEeYQkEPJoEvIiELLvvc9z+p27u2F3s5tsBB1OZiebu5dzf7/v/L7f952zMM8cWIwY+Mk2ulCp92Fnq3XvnzArr2NZnYNldDp0Gw+/OEQ4+obQn5D+4Ubb22+YOGsWi/Todh8AHglKEGkEsnHBQ162511GZFgW6ZCBM9/W4H3iNSQqIe09O196dLKX7d1O39OViP/wthtkND62if/wj/DbMpph8BY/m9xy8BoBmQk+mHqZQGNy4JYRwCoRbwa8l4JXw6M+orJxpU0U6ToKy/5bQsAiTeokGKkTx46RRxxEUgrwGgF4MWNNEJCGgYTvpgnY1IJWg5RzfqLgvcIgktX0i8dmMlFA8qCQ5L0Z/WObPLUxT1i4lWSYDISoEfBYGvM+LlMQQdkLHoWRRZ8zYQI62Thswe5WTORGwNXDcGjqeOA9AF7B8rhzsxMBEoJ8oJKaqPu4hblHMCMPwl9XeNWyb8xkB/DDGYKfMAE6aFL7xesZ389JlgG3XHEMI6UPDOP6JHHu67T2pwNPI69mCP4rEaBDUAJaKc/AOuXiwH07VCS3w5+UQMAuF/WqGI+yFIwVNBwemBD4r0wgQiKoFZa00sEYTwss32lA1tPwVxtc8jQ5/gWCwmGCyUD8vRT0sHBFW4GJDvZmrJFWRY1EkrGA6ZB8/10fOZSSj0E6F+BSP7xidiIzhBmKB09lEwHPkG+UQIyEN44EBiT5vrv2uJXyPQqSqO930fxvcvwbR/+JAkD9EfASgI9EHlp6YiHO4W+cAB20SnrFqxBbNljiXf1Pl1K2S0HCWfiog3YlAD5RGwwxK6oUjTweuVigLjyB0mX410mAFnMoVK1lvvUvgt8fUJH0JVyjuvcmg4dE5mUiFtD24AZ4qBVELxXKS+pMxN43kSdzNwudJ+bQbLlmnxvPOQoCugSap1GnSRoG8KOiKbH+rIA0lEeSAg3y6eeQ6XI2nrYnrPM89bUTgI0Pdqvl50vlNbtZxDUBcLBK0kPd5jPziyLdojJIN0pq5/mdzwL4UVvVInV5ncQEPNOUxa9d0TU+CW5l+FoI0GSDKHVVSOs+0KOsZoxwOzSZNFGv0mQ9avyLCh2Hpm+70Y0YJoJVgmQv822wnDC8Miq6VjJ5IFed0QD1YiAbT+nQE8v/RMZfmgmcCRHIIu7Bmcp39oM9fqEychcA747KxQ/AEyqQonl7hATtJmnhO2XYtgcia01aSbVMenAXrIomPcLgEBA4liGBzFZAT8zBYqW6brI67wg8sFVhxBhwLwBP2+tqBQqqK7VJKGh/BRrfTr6nWL7nYBaZdBJHqrX3kPEPap56xwE/GvjJTRMADeMCdcGpGXL1Xh4ZL8BDOlWkUpegfi0CeDzeA5YITzEnddv+IXL+UYCmqIvqC9UlUC/ki9FipwVjunL3yX7dOTLeXmVMAhbsGporPfyOBTm/BJ23gTVehsvXRnSewagUfpBXF3p5pygKS7OceqTjb7h2vjr/XKm0ZofKSI2Q/J102wHzatZkJPYQ5JoKsuK+EoHJakVzubzuLQDepCKllTZi9AG0DYg9ZLxhFaZsOu7bvlmVI5oPXJMQJcHxHClSln1apFTvAimeg48u0RWFeZW4lVcjbQWZuIQK1KozZfIDO6CSQmQQXdpBaiKZyEWThVK1uEc6v7V7uK0ysduExPZx4vysDR+4SelhBYm0R6LBuR4PXts8MYMcJPsINo4YZCDLj0sgB0/vLpPXvA2Tn42Cv5rsLulGubzW0sEd3d4W/mJt2Kck+DzDMijfPLOjyrDhXSh852B+OvflqAkoyXO1cYfujtc/i3jJSAwhgfFlp20laMLOku/bC7prgqW7lCn4auE5NhcXPd3M7x70+IceSgZvNljCd9k3fLjYsPElqLR14PXQZqD2ZNkkrAB79UeJUebFQmXpf8ZcAQt2XrMQdyNUVBqZoUzAFyp3V3xi/MubUA/mCT4Fhf038PC8XplhWnCmnK/ZzyC2BSTRSqKVOuY2kB8Jia0lvvRIVoP+vVWJbYarf6p655E2/nANBMCWkgD49DA0VAMyI1OLFMYCXiU9bmzi9/y5i/vsaTpHPHidTofzLbM65vMPva9HlovgXp0AvjtaqYMfDD0/4mAsYE92pxa+9k1QgCnRVObCpojpzsKTPvayPetTEgBdwnssjuc0kOBFX+q3HwRQxdrOLAqeYRjkMk/trTSu2Z9Lik7CfF0AvjtqAhS4NHobGXUnB5DQs8hG8p/wMX1r4+8xkmyvQ50JVq72TVeXbz3HvpWaQJi57hJYTw4kGbtS+C2TigQUtZUX+X27QQq2ePBZBru/0lxTm8fOOQ5yaZOZMAV+he4FqIMB+LQB0UgMSajANX29j+vbmly8ipRvHeSQoQOkM5iFXcPQCVwDMs5RBCQmaPOyvbNd6uwvQJ183BZQG3Zc+Eiv7vQOKu8YeDmMcJlt2ckyftVeMIGLBCmdMHl/tFILYwGPjXWO3zOfSq/+om+oa7Mlh2fpSsRGLp7RAW3FUVjNHgiMhyE6zBFjM2BdkdJGO7nP1kJXWAtBuBpPIAu7f+hhu7bFXIuC5xWrf0X2xreykOsUyKkF2gwadbrXDcXrfKxR43zGcSj4t/cCgr+a1iy6EjE5GYktUCl9fwfMeylyooGF48bN2IGLTw8x7StS7sj8TF9FmPGWQhm3rRR+o9lhvjJvSYAdfDUevI1M6bnX/OwWaDMOQ8RPgKRo0eulBTdT8AW2kl8e9L7UHghHwMfLiZPNoSpx0yugpQZaFqKWqxVSM3a2pN1SAhC2jf94I7ybBI7EL5A2Wvu5ht3xsoEt4+Ay/abXgCQAxyOeDsDlTCQzy75ohcGgv9Tra9uiymRUYTLrswOLlCdfAQf7HPDQQ4ErAH5EDXB9cMxWYpjtXApRncojS0sbV/cCgHTHwGNBJy+1PQE2x56FpaVR7wfQGZ37V+V+19EiHNvR6q1fRUjqvbjbMq1/qfHxbTrE10ePY2gPFk48D2CVMTf1AF4PXvyYR9dV6Wf7H413m3xTWQvYGhQ7mfYwA5mAX+18Vue05v/8jG/fZX/IW5MKPKtjSYlt0ellxh+/BOCPAwYaeVr0QofZFxJWVWC8znG70au6llVmktsF0bfHF6k8fvZ5esZJbwHwwnjg59tXz6sL/P0NUZDuSNu1mnJ8Vab17+cy005A9wtOpp3i0bZdpJLUil00semAwN45LgEViZYe3amNye0B6A9chviSlzXVsFtyN5/1H3gaNmMpn8Fz0GpYFp6Zw615H/LpUuRQQDMCL82n5DpBSawkvzIdN2ypiT8nSLth8Pk9jnjwdFzH3W4XW6KMBfwB569NdcGX93mC16tTflcArcYUc/mFuYbV+8zY0SAjAVoNErNgWjtwumJ3wbn/HlBFYdxHvSkJJEc+Ngal9opSwyo9YlITX2C/P/+gf8sxURSLR+mcZUmeqaS9wrh6vxW5zxFCOqFi90RbDWq/YwZmnu1+a6OvdpvRqkNxxe44lyl4OobEnpKA6Uox5EfH9xzPs/HRKrTPWdIQrK1VZDU7ETiD3Obpl+8wPPCRBbkbwNtpW9AbBe5L1SMlj3tdTxk/9W47JUmqS5HU+JzYymUKXjtWVmT9RenIhgXc+nroWLyxXJhmL112OdB8GCsk4f8oZJucnvmmtR85mBn10GZ0EKSCMUSAR3ukcXd5s7LvLD3me61WkuTCpJzYAyRurMB44EdEJzTfU271lUJC03YjXJXzYOGZwN4D8eB5jlfLrdWfzGRW7icMPfiSO6Oe7s20bmhdgLX4Z23B+s3JgQESzUDiMboSzDMHFpNMwccGePauhfwjzwnI2wu9zKGgEFg80jcZ7MHllk07s1H+5yojtUQTlH4nFdLKTGwDmPbIklOb1L1zO4T6N8NCuDLFLS/C63c0eNRimZ++s5BMBHxU11jHchI9oFVUxRh/eMDzHEzGYu0Lg8gJ7oS/tFCwoic44fyUtix0n/46vP4bf+//BRgAYwDDar4ncHIAAAAASUVORK5CYII='; + } +} diff --git a/ThinkPHP/Library/Think/Build.class.php b/ThinkPHP/Library/Think/Build.class.php new file mode 100644 index 0000000..6528107 --- /dev/null +++ b/ThinkPHP/Library/Think/Build.class.php @@ -0,0 +1,165 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * 用于ThinkPHP的自动生成 + */ +class Build { + + static protected $controller = '<?php +namespace [MODULE]\Controller; +use Think\Controller; +class [CONTROLLER]Controller extends Controller { + public function index(){ + $this->show(\'<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p><br/>版本 V{$Think.version}</div><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_55e75dfae343f5a1"></thinkad><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>\',\'utf-8\'); + } +}'; + + static protected $model = '<?php +namespace [MODULE]\Model; +use Think\Model; +class [MODEL]Model extends Model { + +}'; + // 检测应用目录是否需要自动创建 + static public function checkDir($module){ + if(!is_dir(APP_PATH.$module)) { + // 创建模块的目录结构 + self::buildAppDir($module); + }elseif(!is_dir(LOG_PATH)){ + // 检查缓存目录 + self::buildRuntime(); + } + } + + // 创建应用和模块的目录结构 + static public function buildAppDir($module) { + // 没有创建的话自动创建 + if(!is_dir(APP_PATH)) mkdir(APP_PATH,0755,true); + if(is_writeable(APP_PATH)) { + $dirs = array( + COMMON_PATH, + COMMON_PATH.'Common/', + CONF_PATH, + APP_PATH.$module.'/', + APP_PATH.$module.'/Common/', + APP_PATH.$module.'/Controller/', + APP_PATH.$module.'/Model/', + APP_PATH.$module.'/Conf/', + APP_PATH.$module.'/View/', + RUNTIME_PATH, + CACHE_PATH, + CACHE_PATH.$module.'/', + LOG_PATH, + LOG_PATH.$module.'/', + TEMP_PATH, + DATA_PATH, + ); + foreach ($dirs as $dir){ + if(!is_dir($dir)) mkdir($dir,0755,true); + } + // 写入目录安全文件 + self::buildDirSecure($dirs); + // 写入应用配置文件 + if(!is_file(CONF_PATH.'config'.CONF_EXT)) + file_put_contents(CONF_PATH.'config'.CONF_EXT,'.php' == CONF_EXT ? "<?php\nreturn array(\n\t//'配置项'=>'配置值'\n);":''); + // 写入模块配置文件 + if(!is_file(APP_PATH.$module.'/Conf/config'.CONF_EXT)) + file_put_contents(APP_PATH.$module.'/Conf/config'.CONF_EXT,'.php' == CONF_EXT ? "<?php\nreturn array(\n\t//'配置项'=>'配置值'\n);":''); + // 生成模块的测试控制器 + if(defined('BUILD_CONTROLLER_LIST')){ + // 自动生成的控制器列表(注意大小写) + $list = explode(',',BUILD_CONTROLLER_LIST); + foreach($list as $controller){ + self::buildController($module,$controller); + } + }else{ + // 生成默认的控制器 + self::buildController($module); + } + // 生成模块的模型 + if(defined('BUILD_MODEL_LIST')){ + // 自动生成的控制器列表(注意大小写) + $list = explode(',',BUILD_MODEL_LIST); + foreach($list as $model){ + self::buildModel($module,$model); + } + } + }else{ + header('Content-Type:text/html; charset=utf-8'); + exit('应用目录['.APP_PATH.']不可写,目录无法自动生成!<BR>请手动生成项目目录~'); + } + } + + // 检查缓存目录(Runtime) 如果不存在则自动创建 + static public function buildRuntime() { + if(!is_dir(RUNTIME_PATH)) { + mkdir(RUNTIME_PATH); + }elseif(!is_writeable(RUNTIME_PATH)) { + header('Content-Type:text/html; charset=utf-8'); + exit('目录 [ '.RUNTIME_PATH.' ] 不可写!'); + } + mkdir(CACHE_PATH); // 模板缓存目录 + if(!is_dir(LOG_PATH)) mkdir(LOG_PATH); // 日志目录 + if(!is_dir(TEMP_PATH)) mkdir(TEMP_PATH); // 数据缓存目录 + if(!is_dir(DATA_PATH)) mkdir(DATA_PATH); // 数据文件目录 + return true; + } + + // 创建控制器类 + static public function buildController($module,$controller='Index') { + $file = APP_PATH.$module.'/Controller/'.$controller.'Controller'.EXT; + if(!is_file($file)){ + $content = str_replace(array('[MODULE]','[CONTROLLER]'),array($module,$controller),self::$controller); + if(!C('APP_USE_NAMESPACE')){ + $content = preg_replace('/namespace\s(.*?);/','',$content,1); + } + $dir = dirname($file); + if(!is_dir($dir)){ + mkdir($dir, 0755, true); + } + file_put_contents($file,$content); + } + } + + // 创建模型类 + static public function buildModel($module,$model) { + $file = APP_PATH.$module.'/Model/'.$model.'Model'.EXT; + if(!is_file($file)){ + $content = str_replace(array('[MODULE]','[MODEL]'),array($module,$model),self::$model); + if(!C('APP_USE_NAMESPACE')){ + $content = preg_replace('/namespace\s(.*?);/','',$content,1); + } + $dir = dirname($file); + if(!is_dir($dir)){ + mkdir($dir, 0755, true); + } + file_put_contents($file,$content); + } + } + + // 生成目录安全文件 + static public function buildDirSecure($dirs=array()) { + // 目录安全写入(默认开启) + defined('BUILD_DIR_SECURE') or define('BUILD_DIR_SECURE', true); + if(BUILD_DIR_SECURE) { + defined('DIR_SECURE_FILENAME') or define('DIR_SECURE_FILENAME', 'index.html'); + defined('DIR_SECURE_CONTENT') or define('DIR_SECURE_CONTENT', ' '); + // 自动写入目录安全文件 + $content = DIR_SECURE_CONTENT; + $files = explode(',', DIR_SECURE_FILENAME); + foreach ($files as $filename){ + foreach ($dirs as $dir) + file_put_contents($dir.$filename,$content); + } + } + } +} diff --git a/ThinkPHP/Library/Think/Cache.class.php b/ThinkPHP/Library/Think/Cache.class.php new file mode 100644 index 0000000..b098261 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache.class.php @@ -0,0 +1,127 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * 缓存管理类 + */ +class Cache { + + /** + * 操作句柄 + * @var string + * @access protected + */ + protected $handler ; + + /** + * 缓存连接参数 + * @var integer + * @access protected + */ + protected $options = array(); + + /** + * 连接缓存 + * @access public + * @param string $type 缓存类型 + * @param array $options 配置数组 + * @return object + */ + public function connect($type='',$options=array()) { + if(empty($type)) $type = C('DATA_CACHE_TYPE'); + $class = strpos($type,'\\')? $type : 'Think\\Cache\\Driver\\'.ucwords(strtolower($type)); + if(class_exists($class)) + $cache = new $class($options); + else + E(L('_CACHE_TYPE_INVALID_').':'.$type); + return $cache; + } + + /** + * 取得缓存类实例 + * @static + * @access public + * @return mixed + */ + static function getInstance($type='',$options=array()) { + static $_instance = array(); + $guid = $type.to_guid_string($options); + if(!isset($_instance[$guid])){ + $obj = new Cache(); + $_instance[$guid] = $obj->connect($type,$options); + } + return $_instance[$guid]; + } + + public function __get($name) { + return $this->get($name); + } + + public function __set($name,$value) { + return $this->set($name,$value); + } + + public function __unset($name) { + $this->rm($name); + } + public function setOptions($name,$value) { + $this->options[$name] = $value; + } + + public function getOptions($name) { + return $this->options[$name]; + } + + /** + * 队列缓存 + * @access protected + * @param string $key 队列名 + * @return mixed + */ + // + protected function queue($key) { + static $_handler = array( + 'file' => array('F','F'), + 'xcache'=> array('xcache_get','xcache_set'), + 'apc' => array('apc_fetch','apc_store'), + ); + $queue = isset($this->options['queue'])?$this->options['queue']:'file'; + $fun = isset($_handler[$queue])?$_handler[$queue]:$_handler['file']; + $queue_name = isset($this->options['queue_name'])?$this->options['queue_name']:'think_queue'; + $value = $fun[0]($queue_name); + if(!$value) { + $value = array(); + } + // 进列 + if(false===array_search($key, $value)) array_push($value,$key); + if(count($value) > $this->options['length']) { + // 出列 + $key = array_shift($value); + // 删除缓存 + $this->rm($key); + if(APP_DEBUG){ + //调试模式下,记录出列次数 + N($queue_name.'_out_times',1); + } + } + return $fun[1]($queue_name,$value); + } + + public function __call($method,$args){ + //调用缓存类型自己的方法 + if(method_exists($this->handler, $method)){ + return call_user_func_array(array($this->handler,$method), $args); + }else{ + E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); + return; + } + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Cache/Driver/Apachenote.class.php b/ThinkPHP/Library/Think/Cache/Driver/Apachenote.class.php new file mode 100644 index 0000000..4ad3fd7 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Apachenote.class.php @@ -0,0 +1,124 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Apachenote缓存驱动 + */ +class Apachenote extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if(!empty($options)) { + $this->options = $options; + } + if(empty($options)) { + $options = array ( + 'host' => '127.0.0.1', + 'port' => 1042, + 'timeout' => 10, + ); + } + $this->options = $options; + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $this->handler = null; + $this->open(); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + $this->open(); + $name = $this->options['prefix'].$name; + $s = 'F' . pack('N', strlen($name)) . $name; + fwrite($this->handler, $s); + + for ($data = ''; !feof($this->handler);) { + $data .= fread($this->handler, 4096); + } + N('cache_read',1); + $this->close(); + return $data === '' ? '' : unserialize($data); + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @return boolean + */ + public function set($name, $value) { + N('cache_write',1); + $this->open(); + $value = serialize($value); + $name = $this->options['prefix'].$name; + $s = 'S' . pack('NN', strlen($name), strlen($value)) . $name . $value; + + fwrite($this->handler, $s); + $ret = fgets($this->handler); + $this->close(); + if($ret === "OK\n") { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + $this->open(); + $name = $this->options['prefix'].$name; + $s = 'D' . pack('N', strlen($name)) . $name; + fwrite($this->handler, $s); + $ret = fgets($this->handler); + $this->close(); + return $ret === "OK\n"; + } + + /** + * 关闭缓存 + * @access private + */ + private function close() { + fclose($this->handler); + $this->handler = false; + } + + /** + * 打开缓存 + * @access private + */ + private function open() { + if (!is_resource($this->handler)) { + $this->handler = fsockopen($this->options['host'], $this->options['port'], $_, $_, $this->options['timeout']); + } + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Cache/Driver/Apc.class.php b/ThinkPHP/Library/Think/Cache/Driver/Apc.class.php new file mode 100644 index 0000000..4ccb941 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Apc.class.php @@ -0,0 +1,86 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Apc缓存驱动 + */ +class Apc extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if(!function_exists('apc_cache_info')) { + E(L('_NOT_SUPPORT_').':Apc'); + } + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + return apc_fetch($this->options['prefix'].$name); + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value, $expire = null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'].$name; + if($result = apc_store($name, $value, $expire)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + } + return $result; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + return apc_delete($this->options['prefix'].$name); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return apc_clear_cache(); + } + +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Db.class.php b/ThinkPHP/Library/Think/Cache/Driver/Db.class.php new file mode 100644 index 0000000..fc2f210 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Db.class.php @@ -0,0 +1,138 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * 数据库方式缓存驱动 + * CREATE TABLE think_cache ( + * cachekey varchar(255) NOT NULL, + * expire int(11) NOT NULL, + * data blob, + * datacrc int(32), + * UNIQUE KEY `cachekey` (`cachekey`) + * ); + */ +class Db extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if(empty($options)) { + $options = array ( + 'table' => C('DATA_CACHE_TABLE'), + ); + } + $this->options = $options; + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->handler = \Think\Db::getInstance(); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + $name = $this->options['prefix'].addslashes($name); + N('cache_read',1); + $result = $this->handler->query('SELECT `data`,`datacrc` FROM `'.$this->options['table'].'` WHERE `cachekey`=\''.$name.'\' AND (`expire` =0 OR `expire`>'.time().') LIMIT 0,1'); + if(false !== $result ) { + $result = $result[0]; + if(C('DATA_CACHE_CHECK')) {//开启数据校验 + if($result['datacrc'] != md5($result['data'])) {//校验错误 + return false; + } + } + $content = $result['data']; + if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //启用数据压缩 + $content = gzuncompress($content); + } + $content = unserialize($content); + return $content; + } + else { + return false; + } + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value,$expire=null) { + $data = serialize($value); + $name = $this->options['prefix'].addslashes($name); + N('cache_write',1); + if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //数据压缩 + $data = gzcompress($data,3); + } + if(C('DATA_CACHE_CHECK')) {//开启数据校验 + $crc = md5($data); + }else { + $crc = ''; + } + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $expire = ($expire==0)?0: (time()+$expire) ;//缓存有效期为0表示永久缓存 + $result = $this->handler->query('select `cachekey` from `'.$this->options['table'].'` where `cachekey`=\''.$name.'\' limit 0,1'); + if(!empty($result) ) { + //更新记录 + $result = $this->handler->execute('UPDATE '.$this->options['table'].' SET data=\''.$data.'\' ,datacrc=\''.$crc.'\',expire='.$expire.' WHERE `cachekey`=\''.$name.'\''); + }else { + //新增记录 + $result = $this->handler->execute('INSERT INTO '.$this->options['table'].' (`cachekey`,`data`,`datacrc`,`expire`) VALUES (\''.$name.'\',\''.$data.'\',\''.$crc.'\','.$expire.')'); + } + if($result) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + }else { + return false; + } + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + $name = $this->options['prefix'].addslashes($name); + return $this->handler->execute('DELETE FROM `'.$this->options['table'].'` WHERE `cachekey`=\''.$name.'\''); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return $this->handler->execute('TRUNCATE TABLE `'.$this->options['table'].'`'); + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Cache/Driver/Eaccelerator.class.php b/ThinkPHP/Library/Think/Cache/Driver/Eaccelerator.class.php new file mode 100644 index 0000000..751ef24 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Eaccelerator.class.php @@ -0,0 +1,77 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Eaccelerator缓存驱动 + */ +class Eaccelerator extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + return eaccelerator_get($this->options['prefix'].$name); + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value, $expire = null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'].$name; + eaccelerator_lock($name); + if(eaccelerator_put($name, $value, $expire)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + return eaccelerator_rm($this->options['prefix'].$name); + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Cache/Driver/File.class.php b/ThinkPHP/Library/Think/Cache/Driver/File.class.php new file mode 100644 index 0000000..c5c64ef --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/File.class.php @@ -0,0 +1,181 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * 文件类型缓存类 + */ +class File extends Cache { + + /** + * 架构函数 + * @access public + */ + public function __construct($options=array()) { + if(!empty($options)) { + $this->options = $options; + } + $this->options['temp'] = !empty($options['temp'])? $options['temp'] : C('DATA_CACHE_PATH'); + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + if(substr($this->options['temp'], -1) != '/') $this->options['temp'] .= '/'; + $this->init(); + } + + /** + * 初始化检查 + * @access private + * @return boolean + */ + private function init() { + // 创建应用缓存目录 + if (!is_dir($this->options['temp'])) { + mkdir($this->options['temp']); + } + } + + /** + * 取得变量的存储文件名 + * @access private + * @param string $name 缓存变量名 + * @return string + */ + private function filename($name) { + $name = md5(C('DATA_CACHE_KEY').$name); + if(C('DATA_CACHE_SUBDIR')) { + // 使用子目录 + $dir =''; + for($i=0;$i<C('DATA_PATH_LEVEL');$i++) { + $dir .= $name{$i}.'/'; + } + if(!is_dir($this->options['temp'].$dir)) { + mkdir($this->options['temp'].$dir,0755,true); + } + $filename = $dir.$this->options['prefix'].$name.'.php'; + }else{ + $filename = $this->options['prefix'].$name.'.php'; + } + return $this->options['temp'].$filename; + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + $filename = $this->filename($name); + if (!is_file($filename)) { + return false; + } + N('cache_read',1); + $content = file_get_contents($filename); + if( false !== $content) { + $expire = (int)substr($content,8, 12); + if($expire != 0 && time() > filemtime($filename) + $expire) { + //缓存过期删除缓存文件 + unlink($filename); + return false; + } + if(C('DATA_CACHE_CHECK')) {//开启数据校验 + $check = substr($content,20, 32); + $content = substr($content,52, -3); + if($check != md5($content)) {//校验错误 + return false; + } + }else { + $content = substr($content,20, -3); + } + if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //启用数据压缩 + $content = gzuncompress($content); + } + $content = unserialize($content); + return $content; + } + else { + return false; + } + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param int $expire 有效时间 0为永久 + * @return boolean + */ + public function set($name,$value,$expire=null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $filename = $this->filename($name); + $data = serialize($value); + if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //数据压缩 + $data = gzcompress($data,3); + } + if(C('DATA_CACHE_CHECK')) {//开启数据校验 + $check = md5($data); + }else { + $check = ''; + } + $data = "<?php\n//".sprintf('%012d',$expire).$check.$data."\n?>"; + $result = file_put_contents($filename,$data); + if($result) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + clearstatcache(); + return true; + }else { + return false; + } + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + return unlink($this->filename($name)); + } + + /** + * 清除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function clear() { + $path = $this->options['temp']; + $files = scandir($path); + if($files){ + foreach($files as $file){ + if ($file != '.' && $file != '..' && is_dir($path.$file) ){ + array_map( 'unlink', glob( $path.$file.'/*.*' ) ); + }elseif(is_file($path.$file)){ + unlink( $path . $file ); + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Cache/Driver/Memcache.class.php b/ThinkPHP/Library/Think/Cache/Driver/Memcache.class.php new file mode 100644 index 0000000..ff53ebe --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Memcache.class.php @@ -0,0 +1,103 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Memcache缓存驱动 + */ +class Memcache extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + function __construct($options=array()) { + if ( !extension_loaded('memcache') ) { + E(L('_NOT_SUPPORT_').':memcache'); + } + + $options = array_merge(array ( + 'host' => C('MEMCACHE_HOST') ? : '127.0.0.1', + 'port' => C('MEMCACHE_PORT') ? : 11211, + 'timeout' => C('DATA_CACHE_TIMEOUT') ? : false, + 'persistent' => false, + ),$options); + + $this->options = $options; + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $func = $options['persistent'] ? 'pconnect' : 'connect'; + $this->handler = new \Memcache; + $options['timeout'] === false ? + $this->handler->$func($options['host'], $options['port']) : + $this->handler->$func($options['host'], $options['port'], $options['timeout']); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + return $this->handler->get($this->options['prefix'].$name); + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value, $expire = null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'].$name; + if($this->handler->set($name, $value, 0, $expire)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name, $ttl = false) { + $name = $this->options['prefix'].$name; + return $ttl === false ? + $this->handler->delete($name) : + $this->handler->delete($name, $ttl); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return $this->handler->flush(); + } +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Memcached.class.php b/ThinkPHP/Library/Think/Cache/Driver/Memcached.class.php new file mode 100644 index 0000000..929bdca --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Memcached.class.php @@ -0,0 +1,102 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2013 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: 何辉 <runphp@qq.com> +// +---------------------------------------------------------------------- + +namespace Think\Cache\Driver; + +use Memcached as MemcachedResource; +use Think\Cache; + +/** + * Memcached缓存驱动 + */ +class Memcached extends Cache { + + /** + * + * @param array $options + */ + public function __construct($options = array()) { + if ( !extension_loaded('memcached') ) { + E(L('_NOT_SUPPORT_').':memcached'); + } + + $options = array_merge(array( + 'servers' => C('MEMCACHED_SERVER') ? : null, + 'lib_options' => C('MEMCACHED_LIB') ? : null + ), $options); + + $this->options = $options; + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + + $this->handler = new MemcachedResource; + $options['servers'] && $this->handler->addServers($options['servers']); + $options['lib_options'] && $this->handler->setOptions($options['lib_options']); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + return $this->handler->get($this->options['prefix'].$name); + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value, $expire = null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'].$name; + if($this->handler->set($name, $value, time() + $expire)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name, $ttl = false) { + $name = $this->options['prefix'].$name; + return $ttl === false ? + $this->handler->delete($name) : + $this->handler->delete($name, $ttl); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return $this->handler->flush(); + } +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Memcachesae.class.php b/ThinkPHP/Library/Think/Cache/Driver/Memcachesae.class.php new file mode 100644 index 0000000..a1d1c56 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Memcachesae.class.php @@ -0,0 +1,144 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; + +defined('THINK_PATH') or exit(); +/** + * Memcache缓存驱动 + * @category Extend + * @package Extend + * @subpackage Driver.Cache + * @author liu21st <liu21st@gmail.com> + */ +class Memcachesae extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + function __construct($options=array()) { + $options = array_merge(array ( + 'host' => C('MEMCACHE_HOST') ? : '127.0.0.1', + 'port' => C('MEMCACHE_PORT') ? : 11211, + 'timeout' => C('DATA_CACHE_TIMEOUT') ? : false, + 'persistent' => false, + ),$options); + + $this->options = $options; + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $this->handler = memcache_init();//[sae] 下实例化 + //[sae] 下不用链接 + $this->connected=true; + } + + /** + * 是否连接 + * @access private + * @return boolean + */ + private function isConnected() { + return $this->connected; + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + return $this->handler->get($_SERVER['HTTP_APPVERSION'].'/'.$this->options['prefix'].$name); + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value, $expire = null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'].$name; + if($this->handler->set($_SERVER['HTTP_APPVERSION'].'/'.$name, $value, 0, $expire)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name, $ttl = false) { + $name = $_SERVER['HTTP_APPVERSION'].'/'.$this->options['prefix'].$name; + return $ttl === false ? + $this->handler->delete($name) : + $this->handler->delete($name, $ttl); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return $this->handler->flush(); + } + + /** + * 队列缓存 + * @access protected + * @param string $key 队列名 + * @return mixed + */ + //[sae] 下重写queque队列缓存方法 + protected function queue($key) { + $queue_name=isset($this->options['queue_name'])?$this->options['queue_name']:'think_queue'; + $value = F($queue_name); + if(!$value) { + $value = array(); + } + // 进列 + if(false===array_search($key, $value)) array_push($value,$key); + if(count($value) > $this->options['length']) { + // 出列 + $key = array_shift($value); + // 删除缓存 + $this->rm($key); + if (APP_DEBUG) { + //调试模式下记录出队次数 + $counter = Think::instance('SaeCounter'); + if ($counter->exists($queue_name.'_out_times')) + $counter->incr($queue_name.'_out_times'); + else + $counter->create($queue_name.'_out_times', 1); + } + } + return F($queue_name,$value); + } + +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Redis.class.php b/ThinkPHP/Library/Think/Cache/Driver/Redis.class.php new file mode 100644 index 0000000..132cefb --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Redis.class.php @@ -0,0 +1,107 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); + +/** + * Redis缓存驱动 + * 要求安装phpredis扩展:https://github.com/nicolasff/phpredis + */ +class Redis extends Cache { + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if ( !extension_loaded('redis') ) { + E(L('_NOT_SUPPORT_').':redis'); + } + $options = array_merge(array ( + 'host' => C('REDIS_HOST') ? : '127.0.0.1', + 'port' => C('REDIS_PORT') ? : 6379, + 'timeout' => C('DATA_CACHE_TIMEOUT') ? : false, + 'persistent' => false, + ),$options); + + $this->options = $options; + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $func = $options['persistent'] ? 'pconnect' : 'connect'; + $this->handler = new \Redis; + $options['timeout'] === false ? + $this->handler->$func($options['host'], $options['port']) : + $this->handler->$func($options['host'], $options['port'], $options['timeout']); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + $value = $this->handler->get($this->options['prefix'].$name); + $jsonData = json_decode( $value, true ); + return ($jsonData === NULL) ? $value : $jsonData; //检测是否为JSON数据 true 返回JSON解析数组, false返回源数据 + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value, $expire = null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'].$name; + //对数组/对象数据进行缓存处理,保证数据完整性 + $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value; + if(is_int($expire) && $expire) { + $result = $this->handler->setex($name, $expire, $value); + }else{ + $result = $this->handler->set($name, $value); + } + if($result && $this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return $result; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + return $this->handler->delete($this->options['prefix'].$name); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return $this->handler->flushDB(); + } + +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Shmop.class.php b/ThinkPHP/Library/Think/Cache/Driver/Shmop.class.php new file mode 100644 index 0000000..60927c3 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Shmop.class.php @@ -0,0 +1,186 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Shmop缓存驱动 + */ +class Shmop extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if ( !extension_loaded('shmop') ) { + E(L('_NOT_SUPPORT_').':shmop'); + } + if(!empty($options)){ + $options = array( + 'size' => C('SHARE_MEM_SIZE'), + 'temp' => TEMP_PATH, + 'project' => 's', + 'length' => 0, + ); + } + $this->options = $options; + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $this->handler = $this->_ftok($this->options['project']); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name = false) { + N('cache_read',1); + $id = shmop_open($this->handler, 'c', 0600, 0); + if ($id !== false) { + $ret = unserialize(shmop_read($id, 0, shmop_size($id))); + shmop_close($id); + + if ($name === false) { + return $ret; + } + $name = $this->options['prefix'].$name; + if(isset($ret[$name])) { + $content = $ret[$name]; + if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //启用数据压缩 + $content = gzuncompress($content); + } + return $content; + }else { + return null; + } + }else { + return false; + } + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @return boolean + */ + public function set($name, $value) { + N('cache_write',1); + $lh = $this->_lock(); + $val = $this->get(); + if (!is_array($val)) $val = array(); + if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //数据压缩 + $value = gzcompress($value,3); + } + $name = $this->options['prefix'].$name; + $val[$name] = $value; + $val = serialize($val); + if($this->_write($val, $lh)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + $lh = $this->_lock(); + $val = $this->get(); + if (!is_array($val)) $val = array(); + $name = $this->options['prefix'].$name; + unset($val[$name]); + $val = serialize($val); + return $this->_write($val, $lh); + } + + /** + * 生成IPC key + * @access private + * @param string $project 项目标识名 + * @return integer + */ + private function _ftok($project) { + if (function_exists('ftok')) return ftok(__FILE__, $project); + if(strtoupper(PHP_OS) == 'WINNT'){ + $s = stat(__FILE__); + return sprintf("%u", (($s['ino'] & 0xffff) | (($s['dev'] & 0xff) << 16) | + (($project & 0xff) << 24))); + }else { + $filename = __FILE__ . (string) $project; + for($key = array(); sizeof($key) < strlen($filename); $key[] = ord(substr($filename, sizeof($key), 1))); + return dechex(array_sum($key)); + } + } + + /** + * 写入操作 + * @access private + * @param string $name 缓存变量名 + * @return integer|boolean + */ + private function _write(&$val, &$lh) { + $id = shmop_open($this->handler, 'c', 0600, $this->options['size']); + if ($id) { + $ret = shmop_write($id, $val, 0) == strlen($val); + shmop_close($id); + $this->_unlock($lh); + return $ret; + } + $this->_unlock($lh); + return false; + } + + /** + * 共享锁定 + * @access private + * @param string $name 缓存变量名 + * @return boolean + */ + private function _lock() { + if (function_exists('sem_get')) { + $fp = sem_get($this->handler, 1, 0600, 1); + sem_acquire ($fp); + } else { + $fp = fopen($this->options['temp'].$this->options['prefix'].md5($this->handler), 'w'); + flock($fp, LOCK_EX); + } + return $fp; + } + + /** + * 解除共享锁定 + * @access private + * @param string $name 缓存变量名 + * @return boolean + */ + private function _unlock(&$fp) { + if (function_exists('sem_release')) { + sem_release($fp); + } else { + fclose($fp); + } + } +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Sqlite.class.php b/ThinkPHP/Library/Think/Cache/Driver/Sqlite.class.php new file mode 100644 index 0000000..33bd222 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Sqlite.class.php @@ -0,0 +1,119 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Sqlite缓存驱动 + */ +class Sqlite extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if ( !extension_loaded('sqlite') ) { + E(L('_NOT_SUPPORT_').':sqlite'); + } + if(empty($options)) { + $options = array ( + 'db' => ':memory:', + 'table' => 'sharedmemory', + ); + } + $this->options = $options; + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + + $func = $this->options['persistent'] ? 'sqlite_popen' : 'sqlite_open'; + $this->handler = $func($this->options['db']); + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + $name = $this->options['prefix'].sqlite_escape_string($name); + $sql = 'SELECT value FROM '.$this->options['table'].' WHERE var=\''.$name.'\' AND (expire=0 OR expire >'.time().') LIMIT 1'; + $result = sqlite_query($this->handler, $sql); + if (sqlite_num_rows($result)) { + $content = sqlite_fetch_single($result); + if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //启用数据压缩 + $content = gzuncompress($content); + } + return unserialize($content); + } + return false; + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value,$expire=null) { + N('cache_write',1); + $name = $this->options['prefix'].sqlite_escape_string($name); + $value = sqlite_escape_string(serialize($value)); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $expire = ($expire==0)?0: (time()+$expire) ;//缓存有效期为0表示永久缓存 + if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { + //数据压缩 + $value = gzcompress($value,3); + } + $sql = 'REPLACE INTO '.$this->options['table'].' (var, value,expire) VALUES (\''.$name.'\', \''.$value.'\', \''.$expire.'\')'; + if(sqlite_query($this->handler, $sql)){ + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + $name = $this->options['prefix'].sqlite_escape_string($name); + $sql = 'DELETE FROM '.$this->options['table'].' WHERE var=\''.$name.'\''; + sqlite_query($this->handler, $sql); + return true; + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + $sql = 'DELETE FROM '.$this->options['table']; + sqlite_query($this->handler, $sql); + return ; + } +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Wincache.class.php b/ThinkPHP/Library/Think/Cache/Driver/Wincache.class.php new file mode 100644 index 0000000..9d118e9 --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Wincache.class.php @@ -0,0 +1,88 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Wincache缓存驱动 + */ +class Wincache extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if ( !function_exists('wincache_ucache_info') ) { + E(L('_NOT_SUPPORT_').':WinCache'); + } + $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); + $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])? $options['length'] : 0; + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + $name = $this->options['prefix'].$name; + return wincache_ucache_exists($name)? wincache_ucache_get($name) : false; + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value,$expire=null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'].$name; + if(wincache_ucache_set($name, $value, $expire)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + return wincache_ucache_delete($this->options['prefix'].$name); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return wincache_ucache_clear(); + } + +} diff --git a/ThinkPHP/Library/Think/Cache/Driver/Xcache.class.php b/ThinkPHP/Library/Think/Cache/Driver/Xcache.class.php new file mode 100644 index 0000000..ccb1fdd --- /dev/null +++ b/ThinkPHP/Library/Think/Cache/Driver/Xcache.class.php @@ -0,0 +1,90 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Cache\Driver; +use Think\Cache; +defined('THINK_PATH') or exit(); +/** + * Xcache缓存驱动 + */ +class Xcache extends Cache { + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options=array()) { + if ( !function_exists('xcache_info') ) { + E(L('_NOT_SUPPORT_').':Xcache'); + } + $this->options['expire'] = isset($options['expire'])?$options['expire']:C('DATA_CACHE_TIME'); + $this->options['prefix'] = isset($options['prefix'])?$options['prefix']:C('DATA_CACHE_PREFIX'); + $this->options['length'] = isset($options['length'])?$options['length']:0; + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) { + N('cache_read',1); + $name = $this->options['prefix'].$name; + if (xcache_isset($name)) { + return xcache_get($name); + } + return false; + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return boolean + */ + public function set($name, $value,$expire=null) { + N('cache_write',1); + if(is_null($expire)) { + $expire = $this->options['expire'] ; + } + $name = $this->options['prefix'].$name; + if(xcache_set($name, $value, $expire)) { + if($this->options['length']>0) { + // 记录缓存队列 + $this->queue($name); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * @access public + * @param string $name 缓存变量名 + * @return boolean + */ + public function rm($name) { + return xcache_unset($this->options['prefix'].$name); + } + + /** + * 清除缓存 + * @access public + * @return boolean + */ + public function clear() { + return xcache_clear_cache(1, -1); + } +} diff --git a/ThinkPHP/Library/Think/Controller.class.php b/ThinkPHP/Library/Think/Controller.class.php new file mode 100644 index 0000000..ce0f2a1 --- /dev/null +++ b/ThinkPHP/Library/Think/Controller.class.php @@ -0,0 +1,307 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP 控制器基类 抽象类 + */ +abstract class Controller { + + /** + * 视图实例对象 + * @var view + * @access protected + */ + protected $view = null; + + /** + * 控制器参数 + * @var config + * @access protected + */ + protected $config = array(); + + /** + * 架构函数 取得模板对象实例 + * @access public + */ + public function __construct() { + Hook::listen('action_begin',$this->config); + //实例化视图类 + $this->view = Think::instance('Think\View'); + //控制器初始化 + if(method_exists($this,'_initialize')) + $this->_initialize(); + } + + /** + * 模板显示 调用内置的模板引擎显示方法, + * @access protected + * @param string $templateFile 指定要调用的模板文件 + * 默认为空 由系统自动定位模板文件 + * @param string $charset 输出编码 + * @param string $contentType 输出类型 + * @param string $content 输出内容 + * @param string $prefix 模板缓存前缀 + * @return void + */ + protected function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { + $this->view->display($templateFile,$charset,$contentType,$content,$prefix); + } + + /** + * 输出内容文本可以包括Html 并支持内容解析 + * @access protected + * @param string $content 输出内容 + * @param string $charset 模板输出字符集 + * @param string $contentType 输出类型 + * @param string $prefix 模板缓存前缀 + * @return mixed + */ + protected function show($content,$charset='',$contentType='',$prefix='') { + $this->view->display('',$charset,$contentType,$content,$prefix); + } + + /** + * 获取输出页面内容 + * 调用内置的模板引擎fetch方法, + * @access protected + * @param string $templateFile 指定要调用的模板文件 + * 默认为空 由系统自动定位模板文件 + * @param string $content 模板输出内容 + * @param string $prefix 模板缓存前缀* + * @return string + */ + protected function fetch($templateFile='',$content='',$prefix='') { + return $this->view->fetch($templateFile,$content,$prefix); + } + + /** + * 创建静态页面 + * @access protected + * @htmlfile 生成的静态文件名称 + * @htmlpath 生成的静态文件路径 + * @param string $templateFile 指定要调用的模板文件 + * 默认为空 由系统自动定位模板文件 + * @return string + */ + protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') { + $content = $this->fetch($templateFile); + $htmlpath = !empty($htmlpath)?$htmlpath:HTML_PATH; + $htmlfile = $htmlpath.$htmlfile.C('HTML_FILE_SUFFIX'); + Storage::put($htmlfile,$content,'html'); + return $content; + } + + /** + * 模板主题设置 + * @access protected + * @param string $theme 模版主题 + * @return Action + */ + protected function theme($theme){ + $this->view->theme($theme); + return $this; + } + + /** + * 模板变量赋值 + * @access protected + * @param mixed $name 要显示的模板变量 + * @param mixed $value 变量的值 + * @return Action + */ + protected function assign($name,$value='') { + $this->view->assign($name,$value); + return $this; + } + + public function __set($name,$value) { + $this->assign($name,$value); + } + + /** + * 取得模板显示变量的值 + * @access protected + * @param string $name 模板显示变量 + * @return mixed + */ + public function get($name='') { + return $this->view->get($name); + } + + public function __get($name) { + return $this->get($name); + } + + /** + * 检测模板变量的值 + * @access public + * @param string $name 名称 + * @return boolean + */ + public function __isset($name) { + return $this->get($name); + } + + /** + * 魔术方法 有不存在的操作的时候执行 + * @access public + * @param string $method 方法名 + * @param array $args 参数 + * @return mixed + */ + public function __call($method,$args) { + if( 0 === strcasecmp($method,ACTION_NAME.C('ACTION_SUFFIX'))) { + if(method_exists($this,'_empty')) { + // 如果定义了_empty操作 则调用 + $this->_empty($method,$args); + }elseif(file_exists_case($this->view->parseTemplate())){ + // 检查是否存在默认模版 如果有直接输出模版 + $this->display(); + }else{ + E(L('_ERROR_ACTION_').':'.ACTION_NAME); + } + }else{ + E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); + return; + } + } + + /** + * 操作错误跳转的快捷方法 + * @access protected + * @param string $message 错误信息 + * @param string $jumpUrl 页面跳转地址 + * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 + * @return void + */ + protected function error($message='',$jumpUrl='',$ajax=false) { + $this->dispatchJump($message,0,$jumpUrl,$ajax); + } + + /** + * 操作成功跳转的快捷方法 + * @access protected + * @param string $message 提示信息 + * @param string $jumpUrl 页面跳转地址 + * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 + * @return void + */ + protected function success($message='',$jumpUrl='',$ajax=false) { + $this->dispatchJump($message,1,$jumpUrl,$ajax); + } + + /** + * Ajax方式返回数据到客户端 + * @access protected + * @param mixed $data 要返回的数据 + * @param String $type AJAX返回数据格式 + * @param int $json_option 传递给json_encode的option参数 + * @return void + */ + protected function ajaxReturn($data,$type='',$json_option=0) { + if(empty($type)) $type = C('DEFAULT_AJAX_RETURN'); + switch (strtoupper($type)){ + case 'JSON' : + // 返回JSON数据格式到客户端 包含状态信息 + header('Content-Type:application/json; charset=utf-8'); + exit(json_encode($data,$json_option)); + case 'XML' : + // 返回xml格式数据 + header('Content-Type:text/xml; charset=utf-8'); + exit(xml_encode($data)); + case 'JSONP': + // 返回JSON数据格式到客户端 包含状态信息 + header('Content-Type:application/json; charset=utf-8'); + $handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER'); + exit($handler.'('.json_encode($data,$json_option).');'); + case 'EVAL' : + // 返回可执行的js脚本 + header('Content-Type:text/html; charset=utf-8'); + exit($data); + default : + // 用于扩展其他返回格式数据 + Hook::listen('ajax_return',$data); + } + } + + /** + * Action跳转(URL重定向) 支持指定模块和延时跳转 + * @access protected + * @param string $url 跳转的URL表达式 + * @param array $params 其它URL参数 + * @param integer $delay 延时跳转的时间 单位为秒 + * @param string $msg 跳转提示信息 + * @return void + */ + protected function redirect($url,$params=array(),$delay=0,$msg='') { + $url = U($url,$params); + redirect($url,$delay,$msg); + } + + /** + * 默认跳转操作 支持错误导向和正确跳转 + * 调用模板显示 默认为public目录下面的success页面 + * 提示页面为可配置 支持模板标签 + * @param string $message 提示信息 + * @param Boolean $status 状态 + * @param string $jumpUrl 页面跳转地址 + * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 + * @access private + * @return void + */ + private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false) { + if(true === $ajax || IS_AJAX) {// AJAX提交 + $data = is_array($ajax)?$ajax:array(); + $data['info'] = $message; + $data['status'] = $status; + $data['url'] = $jumpUrl; + $this->ajaxReturn($data); + } + if(is_int($ajax)) $this->assign('waitSecond',$ajax); + if(!empty($jumpUrl)) $this->assign('jumpUrl',$jumpUrl); + // 提示标题 + $this->assign('msgTitle',$status? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_')); + //如果设置了关闭窗口,则提示完毕后自动关闭窗口 + if($this->get('closeWin')) $this->assign('jumpUrl','javascript:window.close();'); + $this->assign('status',$status); // 状态 + //保证输出不受静态缓存影响 + C('HTML_CACHE_ON',false); + if($status) { //发送成功信息 + $this->assign('message',$message);// 提示信息 + // 成功操作后默认停留1秒 + if(!isset($this->waitSecond)) $this->assign('waitSecond','1'); + // 默认操作成功自动返回操作前页面 + if(!isset($this->jumpUrl)) $this->assign("jumpUrl",$_SERVER["HTTP_REFERER"]); + $this->display(C('TMPL_ACTION_SUCCESS')); + }else{ + $this->assign('error',$message);// 提示信息 + //发生错误时候默认停留3秒 + if(!isset($this->waitSecond)) $this->assign('waitSecond','3'); + // 默认发生错误的话自动返回上页 + if(!isset($this->jumpUrl)) $this->assign('jumpUrl',"javascript:history.back(-1);"); + $this->display(C('TMPL_ACTION_ERROR')); + // 中止执行 避免出错后继续执行 + exit ; + } + } + + /** + * 析构方法 + * @access public + */ + public function __destruct() { + // 执行后续操作 + Hook::listen('action_end'); + } +} +// 设置控制器别名 便于升级 +class_alias('Think\Controller','Think\Action'); diff --git a/ThinkPHP/Library/Think/Db.class.php b/ThinkPHP/Library/Think/Db.class.php new file mode 100644 index 0000000..5c46e2f --- /dev/null +++ b/ThinkPHP/Library/Think/Db.class.php @@ -0,0 +1,137 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think; + +/** + * ThinkPHP 数据库中间层实现类 + */ +class Db { + + static private $instance = array(); // 数据库连接实例 + static private $_instance = null; // 当前数据库连接实例 + + /** + * 取得数据库类实例 + * @static + * @access public + * @param mixed $config 连接配置 + * @return Object 返回数据库驱动类 + */ + static public function getInstance($config=array()) { + $md5 = md5(serialize($config)); + if(!isset(self::$instance[$md5])) { + // 解析连接参数 支持数组和字符串 + $options = self::parseConfig($config); + // 兼容mysqli + if('mysqli' == $options['type']) $options['type'] = 'mysql'; + // 如果采用lite方式 仅支持原生SQL 包括query和execute方法 + $class = !empty($options['lite'])? 'Think\Db\Lite' : 'Think\\Db\\Driver\\'.ucwords(strtolower($options['type'])); + if(class_exists($class)){ + self::$instance[$md5] = new $class($options); + }else{ + // 类没有定义 + E(L('_NO_DB_DRIVER_').': ' . $class); + } + } + self::$_instance = self::$instance[$md5]; + return self::$_instance; + } + + /** + * 数据库连接参数解析 + * @static + * @access private + * @param mixed $config + * @return array + */ + static private function parseConfig($config){ + if(!empty($config)){ + if(is_string($config)) { + return self::parseDsn($config); + } + $config = array_change_key_case($config); + $config = array ( + 'type' => $config['db_type'], + 'username' => $config['db_user'], + 'password' => $config['db_pwd'], + 'hostname' => $config['db_host'], + 'hostport' => $config['db_port'], + 'database' => $config['db_name'], + 'dsn' => isset($config['db_dsn'])?$config['db_dsn']:null, + 'params' => isset($config['db_params'])?$config['db_params']:null, + 'charset' => isset($config['db_charset'])?$config['db_charset']:'utf8', + 'deploy' => isset($config['db_deploy_type'])?$config['db_deploy_type']:0, + 'rw_separate' => isset($config['db_rw_separate'])?$config['db_rw_separate']:false, + 'master_num' => isset($config['db_master_num'])?$config['db_master_num']:1, + 'slave_no' => isset($config['db_slave_no'])?$config['db_slave_no']:'', + 'debug' => isset($config['db_debug'])?$config['db_debug']:APP_DEBUG, + 'lite' => isset($config['db_lite'])?$config['db_lite']:false, + ); + }else { + $config = array ( + 'type' => C('DB_TYPE'), + 'username' => C('DB_USER'), + 'password' => C('DB_PWD'), + 'hostname' => C('DB_HOST'), + 'hostport' => C('DB_PORT'), + 'database' => C('DB_NAME'), + 'dsn' => C('DB_DSN'), + 'params' => C('DB_PARAMS'), + 'charset' => C('DB_CHARSET'), + 'deploy' => C('DB_DEPLOY_TYPE'), + 'rw_separate' => C('DB_RW_SEPARATE'), + 'master_num' => C('DB_MASTER_NUM'), + 'slave_no' => C('DB_SLAVE_NO'), + 'debug' => C('DB_DEBUG',null,APP_DEBUG), + 'lite' => C('DB_LITE'), + ); + } + return $config; + } + + /** + * DSN解析 + * 格式: mysql://username:passwd@localhost:3306/DbName?param1=val1¶m2=val2#utf8 + * @static + * @access private + * @param string $dsnStr + * @return array + */ + static private function parseDsn($dsnStr) { + if( empty($dsnStr) ){return false;} + $info = parse_url($dsnStr); + if(!$info) { + return false; + } + $dsn = array( + 'type' => $info['scheme'], + 'username' => isset($info['user']) ? $info['user'] : '', + 'password' => isset($info['pass']) ? $info['pass'] : '', + 'hostname' => isset($info['host']) ? $info['host'] : '', + 'hostport' => isset($info['port']) ? $info['port'] : '', + 'database' => isset($info['path']) ? substr($info['path'],1) : '', + 'charset' => isset($info['fragment'])?$info['fragment']:'utf8', + ); + + if(isset($info['query'])) { + parse_str($info['query'],$dsn['params']); + }else{ + $dsn['params'] = array(); + } + return $dsn; + } + + // 调用驱动类的方法 + static public function __callStatic($method, $params){ + return call_user_func_array(array(self::$_instance, $method), $params); + } +} diff --git a/ThinkPHP/Library/Think/Db/Driver.class.php b/ThinkPHP/Library/Think/Db/Driver.class.php new file mode 100644 index 0000000..42d835d --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver.class.php @@ -0,0 +1,1148 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db; +use Think\Config; +use Think\Debug; +use Think\Log; +use PDO; + +abstract class Driver { + // PDO操作实例 + protected $PDOStatement = null; + // 当前操作所属的模型名 + protected $model = '_think_'; + // 当前SQL指令 + protected $queryStr = ''; + protected $modelSql = array(); + // 最后插入ID + protected $lastInsID = null; + // 返回或者影响记录数 + protected $numRows = 0; + // 事务指令数 + protected $transTimes = 0; + // 错误信息 + protected $error = ''; + // 数据库连接ID 支持多个连接 + protected $linkID = array(); + // 当前连接ID + protected $_linkID = null; + // 数据库连接参数配置 + protected $config = array( + 'type' => '', // 数据库类型 + 'hostname' => '127.0.0.1', // 服务器地址 + 'database' => '', // 数据库名 + 'username' => '', // 用户名 + 'password' => '', // 密码 + 'hostport' => '', // 端口 + 'dsn' => '', // + 'params' => array(), // 数据库连接参数 + 'charset' => 'utf8', // 数据库编码默认采用utf8 + 'prefix' => '', // 数据库表前缀 + 'debug' => false, // 数据库调试模式 + 'deploy' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'rw_separate' => false, // 数据库读写是否分离 主从式有效 + 'master_num' => 1, // 读写分离后 主服务器数量 + 'slave_no' => '', // 指定从服务器序号 + 'db_like_fields' => '', + ); + // 数据库表达式 + protected $exp = array('eq'=>'=','neq'=>'<>','gt'=>'>','egt'=>'>=','lt'=>'<','elt'=>'<=','notlike'=>'NOT LIKE','like'=>'LIKE','in'=>'IN','notin'=>'NOT IN','not in'=>'NOT IN','between'=>'BETWEEN','not between'=>'NOT BETWEEN','notbetween'=>'NOT BETWEEN'); + // 查询表达式 + protected $selectSql = 'SELECT%DISTINCT% %FIELD% FROM %TABLE%%FORCE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%LOCK%%COMMENT%'; + // 查询次数 + protected $queryTimes = 0; + // 执行次数 + protected $executeTimes = 0; + // PDO连接参数 + protected $options = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, + PDO::ATTR_STRINGIFY_FETCHES => false, + ); + protected $bind = array(); // 参数绑定 + + /** + * 架构函数 读取数据库配置信息 + * @access public + * @param array $config 数据库配置数组 + */ + public function __construct($config=''){ + if(!empty($config)) { + $this->config = array_merge($this->config,$config); + if(is_array($this->config['params'])){ + $this->options = $this->config['params'] + $this->options; + } + } + } + + /** + * 连接数据库方法 + * @access public + */ + public function connect($config='',$linkNum=0,$autoConnection=false) { + if ( !isset($this->linkID[$linkNum]) ) { + if(empty($config)) $config = $this->config; + try{ + if(empty($config['dsn'])) { + $config['dsn'] = $this->parseDsn($config); + } + if(version_compare(PHP_VERSION,'5.3.6','<=')){ + // 禁用模拟预处理语句 + $this->options[PDO::ATTR_EMULATE_PREPARES] = false; + } + $this->linkID[$linkNum] = new PDO( $config['dsn'], $config['username'], $config['password'],$this->options); + }catch (\PDOException $e) { + if($autoConnection){ + trace($e->getMessage(),'','ERR'); + return $this->connect($autoConnection,$linkNum); + }elseif($config['debug']){ + E($e->getMessage()); + } + } + } + return $this->linkID[$linkNum]; + } + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){} + + /** + * 释放查询结果 + * @access public + */ + public function free() { + $this->PDOStatement = null; + } + + /** + * 执行查询 返回数据集 + * @access public + * @param string $str sql指令 + * @param boolean $fetchSql 不执行只是获取SQL + * @return mixed + */ + public function query($str,$fetchSql=false) { + $this->initConnect(false); + if ( !$this->_linkID ) return false; + $this->queryStr = $str; + if(!empty($this->bind)){ + $that = $this; + $this->queryStr = strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$this->bind)); + } + if($fetchSql){ + return $this->queryStr; + } + //释放前次的查询结果 + if ( !empty($this->PDOStatement) ) $this->free(); + $this->queryTimes++; + N('db_query',1); // 兼容代码 + // 调试开始 + $this->debug(true); + $this->PDOStatement = $this->_linkID->prepare($str); + if(false === $this->PDOStatement){ + $this->error(); + return false; + } + foreach ($this->bind as $key => $val) { + if(is_array($val)){ + $this->PDOStatement->bindValue($key, $val[0], $val[1]); + }else{ + $this->PDOStatement->bindValue($key, $val); + } + } + $this->bind = array(); + try{ + $result = $this->PDOStatement->execute(); + // 调试结束 + $this->debug(false); + if ( false === $result ) { + $this->error(); + return false; + } else { + return $this->getResult(); + } + }catch (\PDOException $e) { + $this->error(); + return false; + } + } + + /** + * 执行语句 + * @access public + * @param string $str sql指令 + * @param boolean $fetchSql 不执行只是获取SQL + * @return mixed + */ + public function execute($str,$fetchSql=false) { + $this->initConnect(true); + if ( !$this->_linkID ) return false; + $this->queryStr = $str; + if(!empty($this->bind)){ + $that = $this; + $this->queryStr = strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$this->bind)); + } + if($fetchSql){ + return $this->queryStr; + } + //释放前次的查询结果 + if ( !empty($this->PDOStatement) ) $this->free(); + $this->executeTimes++; + N('db_write',1); // 兼容代码 + // 记录开始执行时间 + $this->debug(true); + $this->PDOStatement = $this->_linkID->prepare($str); + if(false === $this->PDOStatement) { + $this->error(); + return false; + } + foreach ($this->bind as $key => $val) { + if(is_array($val)){ + $this->PDOStatement->bindValue($key, $val[0], $val[1]); + }else{ + $this->PDOStatement->bindValue($key, $val); + } + } + $this->bind = array(); + try{ + $result = $this->PDOStatement->execute(); + // 调试结束 + $this->debug(false); + if ( false === $result) { + $this->error(); + return false; + } else { + $this->numRows = $this->PDOStatement->rowCount(); + if(preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i", $str)) { + $this->lastInsID = $this->_linkID->lastInsertId(); + } + return $this->numRows; + } + }catch (\PDOException $e) { + $this->error(); + return false; + } + } + + /** + * 启动事务 + * @access public + * @return void + */ + public function startTrans() { + $this->initConnect(true); + if ( !$this->_linkID ) return false; + //数据rollback 支持 + if ($this->transTimes == 0) { + $this->_linkID->beginTransaction(); + } + $this->transTimes++; + return ; + } + + /** + * 用于非自动提交状态下面的查询提交 + * @access public + * @return boolean + */ + public function commit() { + if ($this->transTimes > 0) { + $result = $this->_linkID->commit(); + $this->transTimes = 0; + if(!$result){ + $this->error(); + return false; + } + } + return true; + } + + /** + * 事务回滚 + * @access public + * @return boolean + */ + public function rollback() { + if ($this->transTimes > 0) { + $result = $this->_linkID->rollback(); + $this->transTimes = 0; + if(!$result){ + $this->error(); + return false; + } + } + return true; + } + + /** + * 获得所有的查询数据 + * @access private + * @return array + */ + private function getResult() { + //返回数据集 + $result = $this->PDOStatement->fetchAll(PDO::FETCH_ASSOC); + $this->numRows = count( $result ); + return $result; + } + + /** + * 获得查询次数 + * @access public + * @param boolean $execute 是否包含所有查询 + * @return integer + */ + public function getQueryTimes($execute=false){ + return $execute?$this->queryTimes+$this->executeTimes:$this->queryTimes; + } + + /** + * 获得执行次数 + * @access public + * @return integer + */ + public function getExecuteTimes(){ + return $this->executeTimes; + } + + /** + * 关闭数据库 + * @access public + */ + public function close() { + $this->_linkID = null; + } + + /** + * 数据库错误信息 + * 并显示当前的SQL语句 + * @access public + * @return string + */ + public function error() { + if($this->PDOStatement) { + $error = $this->PDOStatement->errorInfo(); + $this->error = $error[1].':'.$error[2]; + }else{ + $this->error = ''; + } + if('' != $this->queryStr){ + $this->error .= "\n [ SQL语句 ] : ".$this->queryStr; + } + // 记录错误日志 + trace($this->error,'','ERR'); + if($this->config['debug']) {// 开启数据库调试模式 + E($this->error); + }else{ + return $this->error; + } + } + + /** + * 设置锁机制 + * @access protected + * @return string + */ + protected function parseLock($lock=false) { + return $lock? ' FOR UPDATE ' : ''; + } + + /** + * set分析 + * @access protected + * @param array $data + * @return string + */ + protected function parseSet($data) { + foreach ($data as $key=>$val){ + if(is_array($val) && 'exp' == $val[0]){ + $set[] = $this->parseKey($key).'='.$val[1]; + }elseif(is_null($val)){ + $set[] = $this->parseKey($key).'=NULL'; + }elseif(is_scalar($val)) {// 过滤非标量数据 + if(0===strpos($val,':') && in_array($val,array_keys($this->bind)) ){ + $set[] = $this->parseKey($key).'='.$this->escapeString($val); + }else{ + $name = count($this->bind); + $set[] = $this->parseKey($key).'=:'.$name; + $this->bindParam($name,$val); + } + } + } + return ' SET '.implode(',',$set); + } + + /** + * 参数绑定 + * @access protected + * @param string $name 绑定参数名 + * @param mixed $value 绑定值 + * @return void + */ + protected function bindParam($name,$value){ + $this->bind[':'.$name] = $value; + } + + /** + * 字段名分析 + * @access protected + * @param string $key + * @return string + */ + protected function parseKey(&$key) { + return $key; + } + + /** + * value分析 + * @access protected + * @param mixed $value + * @return string + */ + protected function parseValue($value) { + if(is_string($value)) { + $value = strpos($value,':') === 0 && in_array($value,array_keys($this->bind))? $this->escapeString($value) : '\''.$this->escapeString($value).'\''; + }elseif(isset($value[0]) && is_string($value[0]) && strtolower($value[0]) == 'exp'){ + $value = $this->escapeString($value[1]); + }elseif(is_array($value)) { + $value = array_map(array($this, 'parseValue'),$value); + }elseif(is_bool($value)){ + $value = $value ? '1' : '0'; + }elseif(is_null($value)){ + $value = 'null'; + } + return $value; + } + + /** + * field分析 + * @access protected + * @param mixed $fields + * @return string + */ + protected function parseField($fields) { + if(is_string($fields) && '' !== $fields) { + $fields = explode(',',$fields); + } + if(is_array($fields)) { + // 完善数组方式传字段名的支持 + // 支持 'field1'=>'field2' 这样的字段别名定义 + $array = array(); + foreach ($fields as $key=>$field){ + if(!is_numeric($key)) + $array[] = $this->parseKey($key).' AS '.$this->parseKey($field); + else + $array[] = $this->parseKey($field); + } + $fieldsStr = implode(',', $array); + }else{ + $fieldsStr = '*'; + } + //TODO 如果是查询全部字段,并且是join的方式,那么就把要查的表加个别名,以免字段被覆盖 + return $fieldsStr; + } + + /** + * table分析 + * @access protected + * @param mixed $table + * @return string + */ + protected function parseTable($tables) { + if(is_array($tables)) {// 支持别名定义 + $array = array(); + foreach ($tables as $table=>$alias){ + if(!is_numeric($table)) + $array[] = $this->parseKey($table).' '.$this->parseKey($alias); + else + $array[] = $this->parseKey($alias); + } + $tables = $array; + }elseif(is_string($tables)){ + $tables = explode(',',$tables); + array_walk($tables, array(&$this, 'parseKey')); + } + return implode(',',$tables); + } + + /** + * where分析 + * @access protected + * @param mixed $where + * @return string + */ + protected function parseWhere($where) { + $whereStr = ''; + if(is_string($where)) { + // 直接使用字符串条件 + $whereStr = $where; + }else{ // 使用数组表达式 + $operate = isset($where['_logic'])?strtoupper($where['_logic']):''; + if(in_array($operate,array('AND','OR','XOR'))){ + // 定义逻辑运算规则 例如 OR XOR AND NOT + $operate = ' '.$operate.' '; + unset($where['_logic']); + }else{ + // 默认进行 AND 运算 + $operate = ' AND '; + } + foreach ($where as $key=>$val){ + if(is_numeric($key)){ + $key = '_complex'; + } + if(0===strpos($key,'_')) { + // 解析特殊条件表达式 + $whereStr .= $this->parseThinkWhere($key,$val); + }else{ + // 查询字段的安全过滤 + // if(!preg_match('/^[A-Z_\|\&\-.a-z0-9\(\)\,]+$/',trim($key))){ + // E(L('_EXPRESS_ERROR_').':'.$key); + // } + // 多条件支持 + $multi = is_array($val) && isset($val['_multi']); + $key = trim($key); + if(strpos($key,'|')) { // 支持 name|title|nickname 方式定义查询字段 + $array = explode('|',$key); + $str = array(); + foreach ($array as $m=>$k){ + $v = $multi?$val[$m]:$val; + $str[] = $this->parseWhereItem($this->parseKey($k),$v); + } + $whereStr .= '( '.implode(' OR ',$str).' )'; + }elseif(strpos($key,'&')){ + $array = explode('&',$key); + $str = array(); + foreach ($array as $m=>$k){ + $v = $multi?$val[$m]:$val; + $str[] = '('.$this->parseWhereItem($this->parseKey($k),$v).')'; + } + $whereStr .= '( '.implode(' AND ',$str).' )'; + }else{ + $whereStr .= $this->parseWhereItem($this->parseKey($key),$val); + } + } + $whereStr .= $operate; + } + $whereStr = substr($whereStr,0,-strlen($operate)); + } + return empty($whereStr)?'':' WHERE '.$whereStr; + } + + // where子单元分析 + protected function parseWhereItem($key,$val) { + $whereStr = ''; + if(is_array($val)) { + if(is_string($val[0])) { + $exp = strtolower($val[0]); + if(preg_match('/^(eq|neq|gt|egt|lt|elt)$/',$exp)) { // 比较运算 + $whereStr .= $key.' '.$this->exp[$exp].' '.$this->parseValue($val[1]); + }elseif(preg_match('/^(notlike|like)$/',$exp)){// 模糊查找 + if(is_array($val[1])) { + $likeLogic = isset($val[2])?strtoupper($val[2]):'OR'; + if(in_array($likeLogic,array('AND','OR','XOR'))){ + $like = array(); + foreach ($val[1] as $item){ + $like[] = $key.' '.$this->exp[$exp].' '.$this->parseValue($item); + } + $whereStr .= '('.implode(' '.$likeLogic.' ',$like).')'; + } + }else{ + $whereStr .= $key.' '.$this->exp[$exp].' '.$this->parseValue($val[1]); + } + }elseif('bind' == $exp ){ // 使用表达式 + $whereStr .= $key.' = :'.$val[1]; + }elseif('exp' == $exp ){ // 使用表达式 + $whereStr .= $key.' '.$val[1]; + }elseif(preg_match('/^(notin|not in|in)$/',$exp)){ // IN 运算 + if(isset($val[2]) && 'exp'==$val[2]) { + $whereStr .= $key.' '.$this->exp[$exp].' '.$val[1]; + }else{ + if(is_string($val[1])) { + $val[1] = explode(',',$val[1]); + } + $zone = implode(',',$this->parseValue($val[1])); + $whereStr .= $key.' '.$this->exp[$exp].' ('.$zone.')'; + } + }elseif(preg_match('/^(notbetween|not between|between)$/',$exp)){ // BETWEEN运算 + $data = is_string($val[1])? explode(',',$val[1]):$val[1]; + $whereStr .= $key.' '.$this->exp[$exp].' '.$this->parseValue($data[0]).' AND '.$this->parseValue($data[1]); + }else{ + E(L('_EXPRESS_ERROR_').':'.$val[0]); + } + }else { + $count = count($val); + $rule = isset($val[$count-1]) ? (is_array($val[$count-1]) ? strtoupper($val[$count-1][0]) : strtoupper($val[$count-1]) ) : '' ; + if(in_array($rule,array('AND','OR','XOR'))) { + $count = $count -1; + }else{ + $rule = 'AND'; + } + for($i=0;$i<$count;$i++) { + $data = is_array($val[$i])?$val[$i][1]:$val[$i]; + if('exp'==strtolower($val[$i][0])) { + $whereStr .= $key.' '.$data.' '.$rule.' '; + }else{ + $whereStr .= $this->parseWhereItem($key,$val[$i]).' '.$rule.' '; + } + } + $whereStr = '( '.substr($whereStr,0,-4).' )'; + } + }else { + //对字符串类型字段采用模糊匹配 + $likeFields = $this->config['db_like_fields']; + if($likeFields && preg_match('/^('.$likeFields.')$/i',$key)) { + $whereStr .= $key.' LIKE '.$this->parseValue('%'.$val.'%'); + }else { + $whereStr .= $key.' = '.$this->parseValue($val); + } + } + return $whereStr; + } + + /** + * 特殊条件分析 + * @access protected + * @param string $key + * @param mixed $val + * @return string + */ + protected function parseThinkWhere($key,$val) { + $whereStr = ''; + switch($key) { + case '_string': + // 字符串模式查询条件 + $whereStr = $val; + break; + case '_complex': + // 复合查询条件 + $whereStr = substr($this->parseWhere($val),6); + break; + case '_query': + // 字符串模式查询条件 + parse_str($val,$where); + if(isset($where['_logic'])) { + $op = ' '.strtoupper($where['_logic']).' '; + unset($where['_logic']); + }else{ + $op = ' AND '; + } + $array = array(); + foreach ($where as $field=>$data) + $array[] = $this->parseKey($field).' = '.$this->parseValue($data); + $whereStr = implode($op,$array); + break; + } + return '( '.$whereStr.' )'; + } + + /** + * limit分析 + * @access protected + * @param mixed $lmit + * @return string + */ + protected function parseLimit($limit) { + return !empty($limit)? ' LIMIT '.$limit.' ':''; + } + + /** + * join分析 + * @access protected + * @param mixed $join + * @return string + */ + protected function parseJoin($join) { + $joinStr = ''; + if(!empty($join)) { + $joinStr = ' '.implode(' ',$join).' '; + } + return $joinStr; + } + + /** + * order分析 + * @access protected + * @param mixed $order + * @return string + */ + protected function parseOrder($order) { + if(is_array($order)) { + $array = array(); + foreach ($order as $key=>$val){ + if(is_numeric($key)) { + $array[] = $this->parseKey($val); + }else{ + $array[] = $this->parseKey($key).' '.$val; + } + } + $order = implode(',',$array); + } + return !empty($order)? ' ORDER BY '.$order:''; + } + + /** + * group分析 + * @access protected + * @param mixed $group + * @return string + */ + protected function parseGroup($group) { + return !empty($group)? ' GROUP BY '.$group:''; + } + + /** + * having分析 + * @access protected + * @param string $having + * @return string + */ + protected function parseHaving($having) { + return !empty($having)? ' HAVING '.$having:''; + } + + /** + * comment分析 + * @access protected + * @param string $comment + * @return string + */ + protected function parseComment($comment) { + return !empty($comment)? ' /* '.$comment.' */':''; + } + + /** + * distinct分析 + * @access protected + * @param mixed $distinct + * @return string + */ + protected function parseDistinct($distinct) { + return !empty($distinct)? ' DISTINCT ' :''; + } + + /** + * union分析 + * @access protected + * @param mixed $union + * @return string + */ + protected function parseUnion($union) { + if(empty($union)) return ''; + if(isset($union['_all'])) { + $str = 'UNION ALL '; + unset($union['_all']); + }else{ + $str = 'UNION '; + } + foreach ($union as $u){ + $sql[] = $str.(is_array($u)?$this->buildSelectSql($u):$u); + } + return implode(' ',$sql); + } + + /** + * 参数绑定分析 + * @access protected + * @param array $bind + * @return array + */ + protected function parseBind($bind){ + $this->bind = array_merge($this->bind,$bind); + } + + /** + * index分析,可在操作链中指定需要强制使用的索引 + * @access protected + * @param mixed $index + * @return string + */ + protected function parseForce($index) { + if(empty($index)) return ''; + if(is_array($index)) $index = join(",", $index); + return sprintf(" FORCE INDEX ( %s ) ", $index); + } + + /** + * ON DUPLICATE KEY UPDATE 分析 + * @access protected + * @param mixed $duplicate + * @return string + */ + protected function parseDuplicate($duplicate){ + return ''; + } + + /** + * 插入记录 + * @access public + * @param mixed $data 数据 + * @param array $options 参数表达式 + * @param boolean $replace 是否replace + * @return false | integer + */ + public function insert($data,$options=array(),$replace=false) { + $values = $fields = array(); + $this->model = $options['model']; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + foreach ($data as $key=>$val){ + if(is_array($val) && 'exp' == $val[0]){ + $fields[] = $this->parseKey($key); + $values[] = $val[1]; + }elseif(is_null($val)){ + $fields[] = $this->parseKey($key); + $values[] = 'NULL'; + }elseif(is_scalar($val)) { // 过滤非标量数据 + $fields[] = $this->parseKey($key); + if(0===strpos($val,':') && in_array($val,array_keys($this->bind))){ + $values[] = $this->parseValue($val); + }else{ + $name = count($this->bind); + $values[] = ':'.$name; + $this->bindParam($name,$val); + } + } + } + // 兼容数字传入方式 + $replace= (is_numeric($replace) && $replace>0)?true:$replace; + $sql = (true===$replace?'REPLACE':'INSERT').' INTO '.$this->parseTable($options['table']).' ('.implode(',', $fields).') VALUES ('.implode(',', $values).')'.$this->parseDuplicate($replace); + $sql .= $this->parseComment(!empty($options['comment'])?$options['comment']:''); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + + + /** + * 批量插入记录 + * @access public + * @param mixed $dataSet 数据集 + * @param array $options 参数表达式 + * @param boolean $replace 是否replace + * @return false | integer + */ + public function insertAll($dataSet,$options=array(),$replace=false) { + $values = array(); + $this->model = $options['model']; + if(!is_array($dataSet[0])) return false; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + $fields = array_map(array($this,'parseKey'),array_keys($dataSet[0])); + foreach ($dataSet as $data){ + $value = array(); + foreach ($data as $key=>$val){ + if(is_array($val) && 'exp' == $val[0]){ + $value[] = $val[1]; + }elseif(is_null($val)){ + $value[] = 'NULL'; + }elseif(is_scalar($val)){ + if(0===strpos($val,':') && in_array($val,array_keys($this->bind))){ + $value[] = $this->parseValue($val); + }else{ + $name = count($this->bind); + $value[] = ':'.$name; + $this->bindParam($name,$val); + } + } + } + $values[] = 'SELECT '.implode(',', $value); + } + $sql = 'INSERT INTO '.$this->parseTable($options['table']).' ('.implode(',', $fields).') '.implode(' UNION ALL ',$values); + $sql .= $this->parseComment(!empty($options['comment'])?$options['comment']:''); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + + /** + * 通过Select方式插入记录 + * @access public + * @param string $fields 要插入的数据表字段名 + * @param string $table 要插入的数据表名 + * @param array $option 查询数据参数 + * @return false | integer + */ + public function selectInsert($fields,$table,$options=array()) { + $this->model = $options['model']; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + if(is_string($fields)) $fields = explode(',',$fields); + array_walk($fields, array($this, 'parseKey')); + $sql = 'INSERT INTO '.$this->parseTable($table).' ('.implode(',', $fields).') '; + $sql .= $this->buildSelectSql($options); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + + /** + * 更新记录 + * @access public + * @param mixed $data 数据 + * @param array $options 表达式 + * @return false | integer + */ + public function update($data,$options) { + $this->model = $options['model']; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + $table = $this->parseTable($options['table']); + $sql = 'UPDATE ' . $table . $this->parseSet($data); + if(strpos($table,',')){// 多表更新支持JOIN操作 + $sql .= $this->parseJoin(!empty($options['join'])?$options['join']:''); + } + $sql .= $this->parseWhere(!empty($options['where'])?$options['where']:''); + if(!strpos($table,',')){ + // 单表更新支持order和lmit + $sql .= $this->parseOrder(!empty($options['order'])?$options['order']:'') + .$this->parseLimit(!empty($options['limit'])?$options['limit']:''); + } + $sql .= $this->parseComment(!empty($options['comment'])?$options['comment']:''); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + + /** + * 删除记录 + * @access public + * @param array $options 表达式 + * @return false | integer + */ + public function delete($options=array()) { + $this->model = $options['model']; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + $table = $this->parseTable($options['table']); + $sql = 'DELETE FROM '.$table; + if(strpos($table,',')){// 多表删除支持USING和JOIN操作 + if(!empty($options['using'])){ + $sql .= ' USING '.$this->parseTable($options['using']).' '; + } + $sql .= $this->parseJoin(!empty($options['join'])?$options['join']:''); + } + $sql .= $this->parseWhere(!empty($options['where'])?$options['where']:''); + if(!strpos($table,',')){ + // 单表删除支持order和limit + $sql .= $this->parseOrder(!empty($options['order'])?$options['order']:'') + .$this->parseLimit(!empty($options['limit'])?$options['limit']:''); + } + $sql .= $this->parseComment(!empty($options['comment'])?$options['comment']:''); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + + /** + * 查找记录 + * @access public + * @param array $options 表达式 + * @return mixed + */ + public function select($options=array()) { + $this->model = $options['model']; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + $sql = $this->buildSelectSql($options); + $result = $this->query($sql,!empty($options['fetch_sql']) ? true : false); + return $result; + } + + /** + * 生成查询SQL + * @access public + * @param array $options 表达式 + * @return string + */ + public function buildSelectSql($options=array()) { + if(isset($options['page'])) { + // 根据页数计算limit + list($page,$listRows) = $options['page']; + $page = $page>0 ? $page : 1; + $listRows= $listRows>0 ? $listRows : (is_numeric($options['limit'])?$options['limit']:20); + $offset = $listRows*($page-1); + $options['limit'] = $offset.','.$listRows; + } + $sql = $this->parseSql($this->selectSql,$options); + return $sql; + } + + /** + * 替换SQL语句中表达式 + * @access public + * @param array $options 表达式 + * @return string + */ + public function parseSql($sql,$options=array()){ + $sql = str_replace( + array('%TABLE%','%DISTINCT%','%FIELD%','%JOIN%','%WHERE%','%GROUP%','%HAVING%','%ORDER%','%LIMIT%','%UNION%','%LOCK%','%COMMENT%','%FORCE%'), + array( + $this->parseTable($options['table']), + $this->parseDistinct(isset($options['distinct'])?$options['distinct']:false), + $this->parseField(!empty($options['field'])?$options['field']:'*'), + $this->parseJoin(!empty($options['join'])?$options['join']:''), + $this->parseWhere(!empty($options['where'])?$options['where']:''), + $this->parseGroup(!empty($options['group'])?$options['group']:''), + $this->parseHaving(!empty($options['having'])?$options['having']:''), + $this->parseOrder(!empty($options['order'])?$options['order']:''), + $this->parseLimit(!empty($options['limit'])?$options['limit']:''), + $this->parseUnion(!empty($options['union'])?$options['union']:''), + $this->parseLock(isset($options['lock'])?$options['lock']:false), + $this->parseComment(!empty($options['comment'])?$options['comment']:''), + $this->parseForce(!empty($options['force'])?$options['force']:'') + ),$sql); + return $sql; + } + + /** + * 获取最近一次查询的sql语句 + * @param string $model 模型名 + * @access public + * @return string + */ + public function getLastSql($model='') { + return $model?$this->modelSql[$model]:$this->queryStr; + } + + /** + * 获取最近插入的ID + * @access public + * @return string + */ + public function getLastInsID() { + return $this->lastInsID; + } + + /** + * 获取最近的错误信息 + * @access public + * @return string + */ + public function getError() { + return $this->error; + } + + /** + * SQL指令安全过滤 + * @access public + * @param string $str SQL字符串 + * @return string + */ + public function escapeString($str) { + return addslashes($str); + } + + /** + * 设置当前操作模型 + * @access public + * @param string $model 模型名 + * @return void + */ + public function setModel($model){ + $this->model = $model; + } + + /** + * 数据库调试 记录当前SQL + * @access protected + * @param boolean $start 调试开始标记 true 开始 false 结束 + */ + protected function debug($start) { + if($this->config['debug']) {// 开启数据库调试模式 + if($start) { + G('queryStartTime'); + }else{ + $this->modelSql[$this->model] = $this->queryStr; + //$this->model = '_think_'; + // 记录操作结束时间 + G('queryEndTime'); + trace($this->queryStr.' [ RunTime:'.G('queryStartTime','queryEndTime').'s ]','','SQL'); + } + } + } + + /** + * 初始化数据库连接 + * @access protected + * @param boolean $master 主服务器 + * @return void + */ + protected function initConnect($master=true) { + if(!empty($this->config['deploy'])) + // 采用分布式数据库 + $this->_linkID = $this->multiConnect($master); + else + // 默认单数据库 + if ( !$this->_linkID ) $this->_linkID = $this->connect(); + } + + /** + * 连接分布式服务器 + * @access protected + * @param boolean $master 主服务器 + * @return void + */ + protected function multiConnect($master=false) { + // 分布式数据库配置解析 + $_config['username'] = explode(',',$this->config['username']); + $_config['password'] = explode(',',$this->config['password']); + $_config['hostname'] = explode(',',$this->config['hostname']); + $_config['hostport'] = explode(',',$this->config['hostport']); + $_config['database'] = explode(',',$this->config['database']); + $_config['dsn'] = explode(',',$this->config['dsn']); + $_config['charset'] = explode(',',$this->config['charset']); + + $m = floor(mt_rand(0,$this->config['master_num']-1)); + // 数据库读写是否分离 + if($this->config['rw_separate']){ + // 主从式采用读写分离 + if($master) + // 主服务器写入 + $r = $m; + else{ + if(is_numeric($this->config['slave_no'])) {// 指定服务器读 + $r = $this->config['slave_no']; + }else{ + // 读操作连接从服务器 + $r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1)); // 每次随机连接的数据库 + } + } + }else{ + // 读写操作不区分服务器 + $r = floor(mt_rand(0,count($_config['hostname'])-1)); // 每次随机连接的数据库 + } + + if($m != $r ){ + $db_master = array( + 'username' => isset($_config['username'][$m])?$_config['username'][$m]:$_config['username'][0], + 'password' => isset($_config['password'][$m])?$_config['password'][$m]:$_config['password'][0], + 'hostname' => isset($_config['hostname'][$m])?$_config['hostname'][$m]:$_config['hostname'][0], + 'hostport' => isset($_config['hostport'][$m])?$_config['hostport'][$m]:$_config['hostport'][0], + 'database' => isset($_config['database'][$m])?$_config['database'][$m]:$_config['database'][0], + 'dsn' => isset($_config['dsn'][$m])?$_config['dsn'][$m]:$_config['dsn'][0], + 'charset' => isset($_config['charset'][$m])?$_config['charset'][$m]:$_config['charset'][0], + ); + } + $db_config = array( + 'username' => isset($_config['username'][$r])?$_config['username'][$r]:$_config['username'][0], + 'password' => isset($_config['password'][$r])?$_config['password'][$r]:$_config['password'][0], + 'hostname' => isset($_config['hostname'][$r])?$_config['hostname'][$r]:$_config['hostname'][0], + 'hostport' => isset($_config['hostport'][$r])?$_config['hostport'][$r]:$_config['hostport'][0], + 'database' => isset($_config['database'][$r])?$_config['database'][$r]:$_config['database'][0], + 'dsn' => isset($_config['dsn'][$r])?$_config['dsn'][$r]:$_config['dsn'][0], + 'charset' => isset($_config['charset'][$r])?$_config['charset'][$r]:$_config['charset'][0], + ); + return $this->connect($db_config,$r,$r == $m ? false : $db_master); + } + + /** + * 析构方法 + * @access public + */ + public function __destruct() { + // 释放查询 + if ($this->PDOStatement){ + $this->free(); + } + // 关闭连接 + $this->close(); + } +} diff --git a/ThinkPHP/Library/Think/Db/Driver/Firebird.class.php b/ThinkPHP/Library/Think/Db/Driver/Firebird.class.php new file mode 100644 index 0000000..6cc281d --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver/Firebird.class.php @@ -0,0 +1,151 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Db\Driver; +use Think\Db\Driver; + +/** + * Firebird数据库驱动 + */ +class Firebird extends Driver{ + protected $selectSql = 'SELECT %LIMIT% %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%'; + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){ + $dsn = 'firebird:dbname='.$config['hostname'].'/'.($config['hostport']?:3050).':'.$config['database']; + return $dsn; + } + + /** + * 执行语句 + * @access public + * @param string $str sql指令 + * @param boolean $fetchSql 不执行只是获取SQL + * @return mixed + */ + public function execute($str,$fetchSql=false) { + $this->initConnect(true); + if ( !$this->_linkID ) return false; + $this->queryStr = $str; + if(!empty($this->bind)){ + $that = $this; + $this->queryStr = strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$this->bind)); + } + if($fetchSql){ + return $this->queryStr; + } + //释放前次的查询结果 + if ( !empty($this->PDOStatement) ) $this->free(); + $this->executeTimes++; + N('db_write',1); // 兼容代码 + // 记录开始执行时间 + $this->debug(true); + $this->PDOStatement = $this->_linkID->prepare($str); + if(false === $this->PDOStatement) { + E($this->error()); + } + foreach ($this->bind as $key => $val) { + if(is_array($val)){ + $this->PDOStatement->bindValue($key, $val[0], $val[1]); + }else{ + $this->PDOStatement->bindValue($key, $val); + } + } + $this->bind = array(); + $result = $this->PDOStatement->execute(); + $this->debug(false); + if ( false === $result) { + $this->error(); + return false; + } else { + $this->numRows = $this->PDOStatement->rowCount(); + return $this->numRows; + } + } + + /** + * 取得数据表的字段信息 + * @access public + */ + public function getFields($tableName) { + $this->initConnect(true); + list($tableName) = explode(' ', $tableName); + $sql='SELECT RF.RDB$FIELD_NAME AS FIELD,RF.RDB$DEFAULT_VALUE AS DEFAULT1,RF.RDB$NULL_FLAG AS NULL1,TRIM(T.RDB$TYPE_NAME) || \'(\' || F.RDB$FIELD_LENGTH || \')\' as TYPE FROM RDB$RELATION_FIELDS RF LEFT JOIN RDB$FIELDS F ON (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE) LEFT JOIN RDB$TYPES T ON (T.RDB$TYPE = F.RDB$FIELD_TYPE) WHERE RDB$RELATION_NAME=UPPER(\''.$tableName.'\') AND T.RDB$FIELD_NAME = \'RDB$FIELD_TYPE\' ORDER By RDB$FIELD_POSITION'; + $result = $this->query($sql); + $info = array(); + if($result){ + foreach($result as $key => $val){ + $info[trim($val['field'])] = array( + 'name' => trim($val['field']), + 'type' => $val['type'], + 'notnull' => (bool) ($val['null1'] ==1), // 1表示不为Null + 'default' => $val['default1'], + 'primary' => false, + 'autoinc' => false, + ); + } + } + //获取主键 + $sql='select b.rdb$field_name as field_name from rdb$relation_constraints a join rdb$index_segments b on a.rdb$index_name=b.rdb$index_name where a.rdb$constraint_type=\'PRIMARY KEY\' and a.rdb$relation_name=UPPER(\''.$tableName.'\')'; + $rs_temp = $this->query($sql); + foreach($rs_temp as $row) { + $info[trim($row['field_name'])]['primary']= true; + } + return $info; + } + + /** + * 取得数据库的表信息 + * @access public + */ + public function getTables($dbName='') { + $sql='SELECT DISTINCT RDB$RELATION_NAME FROM RDB$RELATION_FIELDS WHERE RDB$SYSTEM_FLAG=0'; + $result = $this->query($sql); + $info = array(); + foreach ($result as $key => $val) { + $info[$key] = trim(current($val)); + } + return $info; + } + + /** + * SQL指令安全过滤 + * @access public + * @param string $str SQL指令 + * @return string + */ + public function escapeString($str) { + return str_replace("'", "''", $str); + } + + /** + * limit + * @access public + * @param $limit limit表达式 + * @return string + */ + public function parseLimit($limit) { + $limitStr = ''; + if(!empty($limit)) { + $limit = explode(',',$limit); + if(count($limit)>1) { + $limitStr = ' FIRST '.$limit[1].' SKIP '.$limit[0].' '; + }else{ + $limitStr = ' FIRST '.$limit[0].' '; + } + } + return $limitStr; + } +} diff --git a/ThinkPHP/Library/Think/Db/Driver/Mongo.class.php b/ThinkPHP/Library/Think/Db/Driver/Mongo.class.php new file mode 100644 index 0000000..a070b8c --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver/Mongo.class.php @@ -0,0 +1,821 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db\Driver; +use Think\Db\Driver; + +/** + * Mongo数据库驱动 + */ +class Mongo extends Driver { + + protected $_mongo = null; // MongoDb Object + protected $_collection = null; // MongoCollection Object + protected $_dbName = ''; // dbName + protected $_collectionName = ''; // collectionName + protected $_cursor = null; // MongoCursor Object + protected $comparison = array('neq'=>'ne','ne'=>'ne','gt'=>'gt','egt'=>'gte','gte'=>'gte','lt'=>'lt','elt'=>'lte','lte'=>'lte','in'=>'in','not in'=>'nin','nin'=>'nin'); + + /** + * 架构函数 读取数据库配置信息 + * @access public + * @param array $config 数据库配置数组 + */ + public function __construct($config=''){ + if ( !class_exists('mongoClient') ) { + E(L('_NOT_SUPPORT_').':Mongo'); + } + if(!empty($config)) { + $this->config = array_merge($this->config,$config); + if(empty($this->config['params'])){ + $this->config['params'] = array(); + } + } + } + + /** + * 连接数据库方法 + * @access public + */ + public function connect($config='',$linkNum=0) { + if ( !isset($this->linkID[$linkNum]) ) { + if(empty($config)) $config = $this->config; + $host = 'mongodb://'.($config['username']?"{$config['username']}":'').($config['password']?":{$config['password']}@":'').$config['hostname'].($config['hostport']?":{$config['hostport']}":'').'/'.($config['database']?"{$config['database']}":''); + try{ + $this->linkID[$linkNum] = new \mongoClient( $host,$this->config['params']); + }catch (\MongoConnectionException $e){ + E($e->getmessage()); + } + } + return $this->linkID[$linkNum]; + } + + /** + * 切换当前操作的Db和Collection + * @access public + * @param string $collection collection + * @param string $db db + * @param boolean $master 是否主服务器 + * @return void + */ + public function switchCollection($collection,$db='',$master=true){ + // 当前没有连接 则首先进行数据库连接 + if ( !$this->_linkID ) $this->initConnect($master); + try{ + if(!empty($db)) { // 传人Db则切换数据库 + // 当前MongoDb对象 + $this->_dbName = $db; + $this->_mongo = $this->_linkID->selectDb($db); + } + // 当前MongoCollection对象 + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.getCollection('.$collection.')'; + } + if($this->_collectionName != $collection) { + $this->queryTimes++; + N('db_query',1); // 兼容代码 + $this->debug(true); + $this->_collection = $this->_mongo->selectCollection($collection); + $this->debug(false); + $this->_collectionName = $collection; // 记录当前Collection名称 + } + }catch (MongoException $e){ + E($e->getMessage()); + } + } + + /** + * 释放查询结果 + * @access public + */ + public function free() { + $this->_cursor = null; + } + + /** + * 执行命令 + * @access public + * @param array $command 指令 + * @return array + */ + public function command($command=array(), $options=array()) { + $cache = isset($options['cache'])?$options['cache']:false; + if($cache) { // 查询缓存检测 + $key = is_string($cache['key'])?$cache['key']:md5(serialize($command)); + $value = S($key,'','',$cache['type']); + if(false !== $value) { + return $value; + } + } + N('db_write',1); // 兼容代码 + $this->executeTimes++; + try{ + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.runCommand('; + $this->queryStr .= json_encode($command); + $this->queryStr .= ')'; + } + $this->debug(true); + $result = $this->_mongo->command($command); + $this->debug(false); + + if($cache && $result['ok']) { // 查询缓存写入 + S($key,$result,$cache['expire'],$cache['type']); + } + return $result; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 执行语句 + * @access public + * @param string $code sql指令 + * @param array $args 参数 + * @return mixed + */ + public function execute($code,$args=array()) { + $this->executeTimes++; + N('db_write',1); // 兼容代码 + $this->debug(true); + $this->queryStr = 'execute:'.$code; + $result = $this->_mongo->execute($code,$args); + $this->debug(false); + if($result['ok']) { + return $result['retval']; + }else{ + E($result['errmsg']); + } + } + + /** + * 关闭数据库 + * @access public + */ + public function close() { + if($this->_linkID) { + $this->_linkID->close(); + $this->_linkID = null; + $this->_mongo = null; + $this->_collection = null; + $this->_cursor = null; + } + } + + /** + * 数据库错误信息 + * @access public + * @return string + */ + public function error() { + $this->error = $this->_mongo->lastError(); + trace($this->error,'','ERR'); + return $this->error; + } + + /** + * 插入记录 + * @access public + * @param mixed $data 数据 + * @param array $options 参数表达式 + * @param boolean $replace 是否replace + * @return false | integer + */ + public function insert($data,$options=array(),$replace=false) { + if(isset($options['table'])) { + $this->switchCollection($options['table']); + } + $this->model = $options['model']; + $this->executeTimes++; + N('db_write',1); // 兼容代码 + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.insert('; + $this->queryStr .= $data?json_encode($data):'{}'; + $this->queryStr .= ')'; + } + try{ + $this->debug(true); + $result = $replace? $this->_collection->save($data): $this->_collection->insert($data); + $this->debug(false); + if($result) { + $_id = $data['_id']; + if(is_object($_id)) { + $_id = $_id->__toString(); + } + $this->lastInsID = $_id; + } + return $result; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 插入多条记录 + * @access public + * @param array $dataList 数据 + * @param array $options 参数表达式 + * @return bool + */ + public function insertAll($dataList,$options=array()) { + if(isset($options['table'])) { + $this->switchCollection($options['table']); + } + $this->model = $options['model']; + $this->executeTimes++; + N('db_write',1); // 兼容代码 + try{ + $this->debug(true); + $result = $this->_collection->batchInsert($dataList); + $this->debug(false); + return $result; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 生成下一条记录ID 用于自增非MongoId主键 + * @access public + * @param string $pk 主键名 + * @return integer + */ + public function getMongoNextId($pk) { + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.find({},{'.$pk.':1}).sort({'.$pk.':-1}).limit(1)'; + } + try{ + $this->debug(true); + $result = $this->_collection->find(array(),array($pk=>1))->sort(array($pk=>-1))->limit(1); + $this->debug(false); + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + $data = $result->getNext(); + return isset($data[$pk])?$data[$pk]+1:1; + } + + /** + * 更新记录 + * @access public + * @param mixed $data 数据 + * @param array $options 表达式 + * @return bool + */ + public function update($data,$options) { + if(isset($options['table'])) { + $this->switchCollection($options['table']); + } + $this->executeTimes++; + N('db_write',1); // 兼容代码 + $this->model = $options['model']; + $query = $this->parseWhere(isset($options['where'])?$options['where']:array()); + $set = $this->parseSet($data); + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.update('; + $this->queryStr .= $query?json_encode($query):'{}'; + $this->queryStr .= ','.json_encode($set).')'; + } + try{ + $this->debug(true); + if(isset($options['limit']) && $options['limit'] == 1) { + $multiple = array("multiple" => false); + }else{ + $multiple = array("multiple" => true); + } + $result = $this->_collection->update($query,$set,$multiple); + $this->debug(false); + return $result; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 删除记录 + * @access public + * @param array $options 表达式 + * @return false | integer + */ + public function delete($options=array()) { + if(isset($options['table'])) { + $this->switchCollection($options['table']); + } + $query = $this->parseWhere(isset($options['where'])?$options['where']:array()); + $this->model = $options['model']; + $this->executeTimes++; + N('db_write',1); // 兼容代码 + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.remove('.json_encode($query).')'; + } + try{ + $this->debug(true); + $result = $this->_collection->remove($query); + $this->debug(false); + return $result; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 清空记录 + * @access public + * @param array $options 表达式 + * @return false | integer + */ + public function clear($options=array()){ + if(isset($options['table'])) { + $this->switchCollection($options['table']); + } + $this->model = $options['model']; + $this->executeTimes++; + N('db_write',1); // 兼容代码 + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.remove({})'; + } + try{ + $this->debug(true); + $result = $this->_collection->drop(); + $this->debug(false); + return $result; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 查找记录 + * @access public + * @param array $options 表达式 + * @return iterator + */ + public function select($options=array()) { + if(isset($options['table'])) { + $this->switchCollection($options['table'],'',false); + } + $this->model = $options['model']; + $this->queryTimes++; + N('db_query',1); // 兼容代码 + $query = $this->parseWhere(isset($options['where'])?$options['where']:array()); + $field = $this->parseField(isset($options['field'])?$options['field']:array()); + try{ + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.find('; + $this->queryStr .= $query? json_encode($query):'{}'; + if(is_array($field) && count($field)) { + foreach ($field as $f=>$v) + $_field_array[$f] = $v ? 1 : 0; + + $this->queryStr .= $field? ', '.json_encode($_field_array):', {}'; + } + $this->queryStr .= ')'; + } + $this->debug(true); + $_cursor = $this->_collection->find($query,$field); + if(!empty($options['order'])) { + $order = $this->parseOrder($options['order']); + if($this->config['debug']) { + $this->queryStr .= '.sort('.json_encode($order).')'; + } + $_cursor = $_cursor->sort($order); + } + if(isset($options['page'])) { // 根据页数计算limit + list($page,$length) = $options['page']; + $page = $page>0 ? $page : 1; + $length = $length>0 ? $length : (is_numeric($options['limit'])?$options['limit']:20); + $offset = $length*((int)$page-1); + $options['limit'] = $offset.','.$length; + } + if(isset($options['limit'])) { + list($offset,$length) = $this->parseLimit($options['limit']); + if(!empty($offset)) { + if($this->config['debug']) { + $this->queryStr .= '.skip('.intval($offset).')'; + } + $_cursor = $_cursor->skip(intval($offset)); + } + if($this->config['debug']) { + $this->queryStr .= '.limit('.intval($length).')'; + } + $_cursor = $_cursor->limit(intval($length)); + } + $this->debug(false); + $this->_cursor = $_cursor; + $resultSet = iterator_to_array($_cursor); + return $resultSet; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 查找某个记录 + * @access public + * @param array $options 表达式 + * @return array + */ + public function find($options=array()){ + $options['limit'] = 1; + $find = $this->select($options); + return array_shift($find); + } + + /** + * 统计记录数 + * @access public + * @param array $options 表达式 + * @return iterator + */ + public function count($options=array()){ + if(isset($options['table'])) { + $this->switchCollection($options['table'],'',false); + } + $this->model = $options['model']; + $this->queryTimes++; + N('db_query',1); // 兼容代码 + $query = $this->parseWhere(isset($options['where'])?$options['where']:array()); + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName; + $this->queryStr .= $query?'.find('.json_encode($query).')':''; + $this->queryStr .= '.count()'; + } + try{ + $this->debug(true); + $count = $this->_collection->count($query); + $this->debug(false); + return $count; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + public function group($keys,$initial,$reduce,$options=array()){ + if(isset($options['table']) && $this->_collectionName != $options['table']) { + $this->switchCollection($options['table'],'',false); + } + + $cache = isset($options['cache'])?$options['cache']:false; + if($cache) { + $key = is_string($cache['key'])?$cache['key']:md5(serialize($options)); + $value = S($key,'','',$cache['type']); + if(false !== $value) { + return $value; + } + } + + $this->model = $options['model']; + $this->queryTimes++; + N('db_query',1); // 兼容代码 + $query = $this->parseWhere(isset($options['where'])?$options['where']:array()); + + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.group({key:'.json_encode($keys).',cond:'. + json_encode($options['condition']) . ',reduce:' . + json_encode($reduce).',initial:'. + json_encode($initial).'})'; + } + try{ + $this->debug(true); + $option = array('condition'=>$options['condition'], 'finalize'=>$options['finalize'], 'maxTimeMS'=>$options['maxTimeMS']); + $group = $this->_collection->group($keys,$initial,$reduce,$options); + $this->debug(false); + + if($cache && $group['ok']) + S($key,$group,$cache['expire'],$cache['type']); + + return $group; + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + } + + /** + * 取得数据表的字段信息 + * @access public + * @return array + */ + public function getFields($collection=''){ + if(!empty($collection) && $collection != $this->_collectionName) { + $this->switchCollection($collection,'',false); + } + $this->queryTimes++; + N('db_query',1); // 兼容代码 + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.findOne()'; + } + try{ + $this->debug(true); + $result = $this->_collection->findOne(); + $this->debug(false); + } catch (\MongoCursorException $e) { + E($e->getMessage()); + } + if($result) { // 存在数据则分析字段 + $info = array(); + foreach ($result as $key=>$val){ + $info[$key] = array( + 'name' => $key, + 'type' => getType($val), + ); + } + return $info; + } + // 暂时没有数据 返回false + return false; + } + + /** + * 取得当前数据库的collection信息 + * @access public + */ + public function getTables(){ + if($this->config['debug']) { + $this->queryStr = $this->_dbName.'.getCollenctionNames()'; + } + $this->queryTimes++; + N('db_query',1); // 兼容代码 + $this->debug(true); + $list = $this->_mongo->listCollections(); + $this->debug(false); + $info = array(); + foreach ($list as $collection){ + $info[] = $collection->getName(); + } + return $info; + } + + /** + * 取得当前数据库的对象 + * @access public + * @return object mongoClient + */ + public function getDB(){ + return $this->_mongo; + } + + /** + * 取得当前集合的对象 + * @access public + * @return object MongoCollection + */ + public function getCollection(){ + return $this->_collection; + } + + /** + * set分析 + * @access protected + * @param array $data + * @return string + */ + protected function parseSet($data) { + $result = array(); + foreach ($data as $key=>$val){ + if(is_array($val)) { + switch($val[0]) { + case 'inc': + $result['$inc'][$key] = (int)$val[1]; + break; + case 'set': + case 'unset': + case 'push': + case 'pushall': + case 'addtoset': + case 'pop': + case 'pull': + case 'pullall': + $result['$'.$val[0]][$key] = $val[1]; + break; + default: + $result['$set'][$key] = $val; + } + }else{ + $result['$set'][$key] = $val; + } + } + return $result; + } + + /** + * order分析 + * @access protected + * @param mixed $order + * @return array + */ + protected function parseOrder($order) { + if(is_string($order)) { + $array = explode(',',$order); + $order = array(); + foreach ($array as $key=>$val){ + $arr = explode(' ',trim($val)); + if(isset($arr[1])) { + $arr[1] = $arr[1]=='asc'?1:-1; + }else{ + $arr[1] = 1; + } + $order[$arr[0]] = $arr[1]; + } + } + return $order; + } + + /** + * limit分析 + * @access protected + * @param mixed $limit + * @return array + */ + protected function parseLimit($limit) { + if(strpos($limit,',')) { + $array = explode(',',$limit); + }else{ + $array = array(0,$limit); + } + return $array; + } + + /** + * field分析 + * @access protected + * @param mixed $fields + * @return array + */ + public function parseField($fields){ + if(empty($fields)) { + $fields = array(); + } + if(is_string($fields)) { + $_fields = explode(',',$fields); + $fields = array(); + foreach ($_fields as $f) + $fields[$f] = true; + }elseif(is_array($fields)) { + $_fields = $fields; + $fields = array(); + foreach ($_fields as $f=>$v) { + if(is_numeric($f)) + $fields[$v] = true; + else + $fields[$f] = $v ? true : false; + } + } + return $fields; + } + + /** + * where分析 + * @access protected + * @param mixed $where + * @return array + */ + public function parseWhere($where){ + $query = array(); + $return = array(); + $_logic = '$and'; + if(isset($where['_logic'])){ + $where['_logic'] = strtolower($where['_logic']); + $_logic = in_array($where['_logic'], array('or','xor','nor', 'and'))?'$'.$where['_logic']:$_logic; + unset($where['_logic']); + } + foreach ($where as $key=>$val){ + if('_id' != $key && 0===strpos($key,'_')) { + // 解析特殊条件表达式 + $parse = $this->parseThinkWhere($key,$val); + $query = array_merge($query,$parse); + }else{ + // 查询字段的安全过滤 + if(!preg_match('/^[A-Z_\|\&\-.a-z0-9]+$/',trim($key))){ + E(L('_ERROR_QUERY_').':'.$key); + } + $key = trim($key); + if(strpos($key,'|')) { + $array = explode('|',$key); + $str = array(); + foreach ($array as $k){ + $str[] = $this->parseWhereItem($k,$val); + } + $query['$or'] = $str; + }elseif(strpos($key,'&')){ + $array = explode('&',$key); + $str = array(); + foreach ($array as $k){ + $str[] = $this->parseWhereItem($k,$val); + } + $query = array_merge($query,$str); + }else{ + $str = $this->parseWhereItem($key,$val); + $query = array_merge($query,$str); + } + } + } + if($_logic == '$and') + return $query; + + foreach($query as $key=>$val) + $return[$_logic][] = array($key=>$val); + + return $return; + } + + /** + * 特殊条件分析 + * @access protected + * @param string $key + * @param mixed $val + * @return string + */ + protected function parseThinkWhere($key,$val) { + $query = array(); + $_logic = array('or','xor','nor', 'and'); + + switch($key) { + case '_query': // 字符串模式查询条件 + parse_str($val,$query); + if(isset($query['_logic']) && strtolower($query['_logic']) == 'or' ) { + unset($query['_logic']); + $query['$or'] = $query; + } + break; + case '_complex': // 子查询模式查询条件 + $__logic = strtolower($val['_logic']); + if(isset($val['_logic']) && in_array($__logic, $_logic) ) { + unset($val['_logic']); + $query['$'.$__logic] = $val; + } + break; + case '_string':// MongoCode查询 + $query['$where'] = new \MongoCode($val); + break; + } + //兼容 MongoClient OR条件查询方法 + if(isset($query['$or']) && !is_array(current($query['$or']))) { + $val = array(); + foreach ($query['$or'] as $k=>$v) + $val[] = array($k=>$v); + $query['$or'] = $val; + } + return $query; + } + + /** + * where子单元分析 + * @access protected + * @param string $key + * @param mixed $val + * @return array + */ + protected function parseWhereItem($key,$val) { + $query = array(); + if(is_array($val)) { + if(is_string($val[0])) { + $con = strtolower($val[0]); + if(in_array($con,array('neq','ne','gt','egt','gte','lt','lte','elt'))) { // 比较运算 + $k = '$'.$this->comparison[$con]; + $query[$key] = array($k=>$val[1]); + }elseif('like'== $con){ // 模糊查询 采用正则方式 + $query[$key] = new \MongoRegex("/".$val[1]."/"); + }elseif('mod'==$con){ // mod 查询 + $query[$key] = array('$mod'=>$val[1]); + }elseif('regex'==$con){ // 正则查询 + $query[$key] = new \MongoRegex($val[1]); + }elseif(in_array($con,array('in','nin','not in'))){ // IN NIN 运算 + $data = is_string($val[1])? explode(',',$val[1]):$val[1]; + $k = '$'.$this->comparison[$con]; + $query[$key] = array($k=>$data); + }elseif('all'==$con){ // 满足所有指定条件 + $data = is_string($val[1])? explode(',',$val[1]):$val[1]; + $query[$key] = array('$all'=>$data); + }elseif('between'==$con){ // BETWEEN运算 + $data = is_string($val[1])? explode(',',$val[1]):$val[1]; + $query[$key] = array('$gte'=>$data[0],'$lte'=>$data[1]); + }elseif('not between'==$con){ + $data = is_string($val[1])? explode(',',$val[1]):$val[1]; + $query[$key] = array('$lt'=>$data[0],'$gt'=>$data[1]); + }elseif('exp'==$con){ // 表达式查询 + $query['$where'] = new \MongoCode($val[1]); + }elseif('exists'==$con){ // 字段是否存在 + $query[$key] = array('$exists'=>(bool)$val[1]); + }elseif('size'==$con){ // 限制属性大小 + $query[$key] = array('$size'=>intval($val[1])); + }elseif('type'==$con){ // 限制字段类型 1 浮点型 2 字符型 3 对象或者MongoDBRef 5 MongoBinData 7 MongoId 8 布尔型 9 MongoDate 10 NULL 15 MongoCode 16 32位整型 17 MongoTimestamp 18 MongoInt64 如果是数组的话判断元素的类型 + $query[$key] = array('$type'=>intval($val[1])); + }else{ + $query[$key] = $val; + } + return $query; + } + } + $query[$key] = $val; + return $query; + } +} diff --git a/ThinkPHP/Library/Think/Db/Driver/Mysql.class.php b/ThinkPHP/Library/Think/Db/Driver/Mysql.class.php new file mode 100644 index 0000000..ee0a338 --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver/Mysql.class.php @@ -0,0 +1,235 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db\Driver; +use Think\Db\Driver; + +/** + * mysql数据库驱动 + */ +class Mysql extends Driver{ + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){ + $dsn = 'mysql:dbname='.$config['database'].';host='.$config['hostname']; + if(!empty($config['hostport'])) { + $dsn .= ';port='.$config['hostport']; + }elseif(!empty($config['socket'])){ + $dsn .= ';unix_socket='.$config['socket']; + } + + if(!empty($config['charset'])){ + //为兼容各版本PHP,用两种方式设置编码 + $this->options[\PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$config['charset']; + $dsn .= ';charset='.$config['charset']; + } + return $dsn; + } + + /** + * 取得数据表的字段信息 + * @access public + */ + public function getFields($tableName) { + $this->initConnect(true); + list($tableName) = explode(' ', $tableName); + if(strpos($tableName,'.')){ + list($dbName,$tableName) = explode('.',$tableName); + $sql = 'SHOW COLUMNS FROM `'.$dbName.'`.`'.$tableName.'`'; + }else{ + $sql = 'SHOW COLUMNS FROM `'.$tableName.'`'; + } + + $result = $this->query($sql); + $info = array(); + if($result) { + foreach ($result as $key => $val) { + if(\PDO::CASE_LOWER != $this->_linkID->getAttribute(\PDO::ATTR_CASE)){ + $val = array_change_key_case ( $val , CASE_LOWER ); + } + $info[$val['field']] = array( + 'name' => $val['field'], + 'type' => $val['type'], + 'notnull' => (bool) ($val['null'] === ''), // not null is empty, null is yes + 'default' => $val['default'], + 'primary' => (strtolower($val['key']) == 'pri'), + 'autoinc' => (strtolower($val['extra']) == 'auto_increment'), + ); + } + } + return $info; + } + + /** + * 取得数据库的表信息 + * @access public + */ + public function getTables($dbName='') { + $sql = !empty($dbName)?'SHOW TABLES FROM '.$dbName:'SHOW TABLES '; + $result = $this->query($sql); + $info = array(); + foreach ($result as $key => $val) { + $info[$key] = current($val); + } + return $info; + } + + /** + * 字段和表名处理 + * @access protected + * @param string $key + * @return string + */ + protected function parseKey(&$key) { + $key = trim($key); + if(!is_numeric($key) && !preg_match('/[,\'\"\*\(\)`.\s]/',$key)) { + $key = '`'.$key.'`'; + } + return $key; + } + + /** + * 批量插入记录 + * @access public + * @param mixed $dataSet 数据集 + * @param array $options 参数表达式 + * @param boolean $replace 是否replace + * @return false | integer + */ + public function insertAll($dataSet,$options=array(),$replace=false) { + $values = array(); + $this->model = $options['model']; + if(!is_array($dataSet[0])) return false; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + $fields = array_map(array($this,'parseKey'),array_keys($dataSet[0])); + foreach ($dataSet as $data){ + $value = array(); + foreach ($data as $key=>$val){ + if(is_array($val) && 'exp' == $val[0]){ + $value[] = $val[1]; + }elseif(is_null($val)){ + $value[] = 'NULL'; + }elseif(is_scalar($val)){ + if(0===strpos($val,':') && in_array($val,array_keys($this->bind))){ + $value[] = $this->parseValue($val); + }else{ + $name = count($this->bind); + $value[] = ':'.$name; + $this->bindParam($name,$val); + } + } + } + $values[] = '('.implode(',', $value).')'; + } + // 兼容数字传入方式 + $replace= (is_numeric($replace) && $replace>0)?true:$replace; + $sql = (true===$replace?'REPLACE':'INSERT').' INTO '.$this->parseTable($options['table']).' ('.implode(',', $fields).') VALUES '.implode(',',$values).$this->parseDuplicate($replace); + $sql .= $this->parseComment(!empty($options['comment'])?$options['comment']:''); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + + /** + * ON DUPLICATE KEY UPDATE 分析 + * @access protected + * @param mixed $duplicate + * @return string + */ + protected function parseDuplicate($duplicate){ + // 布尔值或空则返回空字符串 + if(is_bool($duplicate) || empty($duplicate)) return ''; + + if(is_string($duplicate)){ + // field1,field2 转数组 + $duplicate = explode(',', $duplicate); + }elseif(is_object($duplicate)){ + // 对象转数组 + $duplicate = get_class_vars($duplicate); + } + $updates = array(); + foreach((array) $duplicate as $key=>$val){ + if(is_numeric($key)){ // array('field1', 'field2', 'field3') 解析为 ON DUPLICATE KEY UPDATE field1=VALUES(field1), field2=VALUES(field2), field3=VALUES(field3) + $updates[] = $this->parseKey($val)."=VALUES(".$this->parseKey($val).")"; + }else{ + if(is_scalar($val)) // 兼容标量传值方式 + $val = array('value', $val); + if(!isset($val[1])) continue; + switch($val[0]){ + case 'exp': // 表达式 + $updates[] = $this->parseKey($key)."=($val[1])"; + break; + case 'value': // 值 + default: + $name = count($this->bind); + $updates[] = $this->parseKey($key)."=:".$name; + $this->bindParam($name, $val[1]); + break; + } + } + } + if(empty($updates)) return ''; + return " ON DUPLICATE KEY UPDATE ".join(', ', $updates); + } + + + + /** + * 执行存储过程查询 返回多个数据集 + * @access public + * @param string $str sql指令 + * @param boolean $fetchSql 不执行只是获取SQL + * @return mixed + */ + public function procedure($str,$fetchSql=false) { + $this->initConnect(false); + $this->_linkID->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_WARNING); + if ( !$this->_linkID ) return false; + $this->queryStr = $str; + if($fetchSql){ + return $this->queryStr; + } + //释放前次的查询结果 + if ( !empty($this->PDOStatement) ) $this->free(); + $this->queryTimes++; + N('db_query',1); // 兼容代码 + // 调试开始 + $this->debug(true); + $this->PDOStatement = $this->_linkID->prepare($str); + if(false === $this->PDOStatement){ + $this->error(); + return false; + } + try{ + $result = $this->PDOStatement->execute(); + // 调试结束 + $this->debug(false); + do + { + $result = $this->PDOStatement->fetchAll(\PDO::FETCH_ASSOC); + if ($result) + { + $resultArr[] = $result; + } + } + while ($this->PDOStatement->nextRowset()); + $this->_linkID->setAttribute(\PDO::ATTR_ERRMODE, $this->options[\PDO::ATTR_ERRMODE]); + return $resultArr; + }catch (\PDOException $e) { + $this->error(); + $this->_linkID->setAttribute(\PDO::ATTR_ERRMODE, $this->options[\PDO::ATTR_ERRMODE]); + return false; + } + } +} diff --git a/ThinkPHP/Library/Think/Db/Driver/Oracle.class.php b/ThinkPHP/Library/Think/Db/Driver/Oracle.class.php new file mode 100644 index 0000000..6bf5477 --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver/Oracle.class.php @@ -0,0 +1,168 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db\Driver; +use Think\Db\Driver; + +/** + * Oracle数据库驱动 + */ +class Oracle extends Driver{ + + private $table = ''; + protected $selectSql = 'SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%) thinkphp ) %LIMIT%%COMMENT%'; + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){ + $dsn = 'oci:dbname=//'.$config['hostname'].($config['hostport']?':'.$config['hostport']:'').'/'.$config['database']; + if(!empty($config['charset'])) { + $dsn .= ';charset='.$config['charset']; + } + return $dsn; + } + + /** + * 执行语句 + * @access public + * @param string $str sql指令 + * @param boolean $fetchSql 不执行只是获取SQL + * @return integer + */ + public function execute($str,$fetchSql=false) { + $this->initConnect(true); + if ( !$this->_linkID ) return false; + $this->queryStr = $str; + if(!empty($this->bind)){ + $that = $this; + $this->queryStr = strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$this->bind)); + } + if($fetchSql){ + return $this->queryStr; + } + $flag = false; + if(preg_match("/^\s*(INSERT\s+INTO)\s+(\w+)\s+/i", $str, $match)) { + $this->table = C("DB_SEQUENCE_PREFIX").str_ireplace(C("DB_PREFIX"), "", $match[2]); + $flag = (boolean)$this->query("SELECT * FROM user_sequences WHERE sequence_name='" . strtoupper($this->table) . "'"); + } + //释放前次的查询结果 + if ( !empty($this->PDOStatement) ) $this->free(); + $this->executeTimes++; + N('db_write',1); // 兼容代码 + // 记录开始执行时间 + $this->debug(true); + $this->PDOStatement = $this->_linkID->prepare($str); + if(false === $this->PDOStatement) { + $this->error(); + return false; + } + foreach ($this->bind as $key => $val) { + if(is_array($val)){ + $this->PDOStatement->bindValue($key, $val[0], $val[1]); + }else{ + $this->PDOStatement->bindValue($key, $val); + } + } + $this->bind = array(); + $result = $this->PDOStatement->execute(); + $this->debug(false); + if ( false === $result) { + $this->error(); + return false; + } else { + $this->numRows = $this->PDOStatement->rowCount(); + if($flag || preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i", $str)) { + $this->lastInsID = $this->_linkID->lastInsertId(); + } + return $this->numRows; + } + } + + /** + * 取得数据表的字段信息 + * @access public + */ + public function getFields($tableName) { + list($tableName) = explode(' ', $tableName); + $result = $this->query("select a.column_name,data_type,decode(nullable,'Y',0,1) notnull,data_default,decode(a.column_name,b.column_name,1,0) pk " + ."from user_tab_columns a,(select column_name from user_constraints c,user_cons_columns col " + ."where c.constraint_name=col.constraint_name and c.constraint_type='P'and c.table_name='".strtoupper($tableName) + ."') b where table_name='".strtoupper($tableName)."' and a.column_name=b.column_name(+)"); + $info = array(); + if($result) { + foreach ($result as $key => $val) { + $info[strtolower($val['column_name'])] = array( + 'name' => strtolower($val['column_name']), + 'type' => strtolower($val['data_type']), + 'notnull' => $val['notnull'], + 'default' => $val['data_default'], + 'primary' => $val['pk'], + 'autoinc' => $val['pk'], + ); + } + } + return $info; + } + + /** + * 取得数据库的表信息(暂时实现取得用户表信息) + * @access public + */ + public function getTables($dbName='') { + $result = $this->query("select table_name from user_tables"); + $info = array(); + foreach ($result as $key => $val) { + $info[$key] = current($val); + } + return $info; + } + + /** + * SQL指令安全过滤 + * @access public + * @param string $str SQL指令 + * @return string + */ + public function escapeString($str) { + return str_ireplace("'", "''", $str); + } + + /** + * limit + * @access public + * @return string + */ + public function parseLimit($limit) { + $limitStr = ''; + if(!empty($limit)) { + $limit = explode(',',$limit); + if(count($limit)>1) + $limitStr = "(numrow>" . $limit[0] . ") AND (numrow<=" . ($limit[0]+$limit[1]) . ")"; + else + $limitStr = "(numrow>0 AND numrow<=".$limit[0].")"; + } + return $limitStr?' WHERE '.$limitStr:''; + } + + /** + * 设置锁机制 + * @access protected + * @return string + */ + protected function parseLock($lock=false) { + if(!$lock) return ''; + return ' FOR UPDATE NOWAIT '; + } +} diff --git a/ThinkPHP/Library/Think/Db/Driver/Pgsql.class.php b/ThinkPHP/Library/Think/Db/Driver/Pgsql.class.php new file mode 100644 index 0000000..e1223a4 --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver/Pgsql.class.php @@ -0,0 +1,91 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db\Driver; +use Think\Db\Driver; + +/** + * Pgsql数据库驱动 + */ +class Pgsql extends Driver{ + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){ + $dsn = 'pgsql:dbname='.$config['database'].';host='.$config['hostname']; + if(!empty($config['hostport'])) { + $dsn .= ';port='.$config['hostport']; + } + return $dsn; + } + + /** + * 取得数据表的字段信息 + * @access public + * @return array + */ + public function getFields($tableName) { + list($tableName) = explode(' ', $tableName); + $result = $this->query('select fields_name as "field",fields_type as "type",fields_not_null as "null",fields_key_name as "key",fields_default as "default",fields_default as "extra" from table_msg('.$tableName.');'); + $info = array(); + if($result){ + foreach ($result as $key => $val) { + $info[$val['field']] = array( + 'name' => $val['field'], + 'type' => $val['type'], + 'notnull' => (bool) ($val['null'] === ''), // not null is empty, null is yes + 'default' => $val['default'], + 'primary' => (strtolower($val['key']) == 'pri'), + 'autoinc' => (strtolower($val['extra']) == 'auto_increment'), + ); + } + } + return $info; + } + + /** + * 取得数据库的表信息 + * @access public + * @return array + */ + public function getTables($dbName='') { + $result = $this->query("select tablename as Tables_in_test from pg_tables where schemaname ='public'"); + $info = array(); + foreach ($result as $key => $val) { + $info[$key] = current($val); + } + return $info; + } + + /** + * limit分析 + * @access protected + * @param mixed $lmit + * @return string + */ + public function parseLimit($limit) { + $limitStr = ''; + if(!empty($limit)) { + $limit = explode(',',$limit); + if(count($limit)>1) { + $limitStr .= ' LIMIT '.$limit[1].' OFFSET '.$limit[0].' '; + }else{ + $limitStr .= ' LIMIT '.$limit[0].' '; + } + } + return $limitStr; + } + +} diff --git a/ThinkPHP/Library/Think/Db/Driver/Sqlite.class.php b/ThinkPHP/Library/Think/Db/Driver/Sqlite.class.php new file mode 100644 index 0000000..d7fd641 --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver/Sqlite.class.php @@ -0,0 +1,98 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db\Driver; +use Think\Db\Driver; + +/** + * Sqlite数据库驱动 + */ +class Sqlite extends Driver { + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){ + $dsn = 'sqlite:'.$config['database']; + return $dsn; + } + + /** + * 取得数据表的字段信息 + * @access public + * @return array + */ + public function getFields($tableName) { + list($tableName) = explode(' ', $tableName); + $result = $this->query('PRAGMA table_info( '.$tableName.' )'); + $info = array(); + if($result){ + foreach ($result as $key => $val) { + $info[$val['field']] = array( + 'name' => $val['field'], + 'type' => $val['type'], + 'notnull' => (bool) ($val['null'] === ''), // not null is empty, null is yes + 'default' => $val['default'], + 'primary' => (strtolower($val['dey']) == 'pri'), + 'autoinc' => (strtolower($val['extra']) == 'auto_increment'), + ); + } + } + return $info; + } + + /** + * 取得数据库的表信息 + * @access public + * @return array + */ + public function getTables($dbName='') { + $result = $this->query("SELECT name FROM sqlite_master WHERE type='table' " + . "UNION ALL SELECT name FROM sqlite_temp_master " + . "WHERE type='table' ORDER BY name"); + $info = array(); + foreach ($result as $key => $val) { + $info[$key] = current($val); + } + return $info; + } + + /** + * SQL指令安全过滤 + * @access public + * @param string $str SQL指令 + * @return string + */ + public function escapeString($str) { + return str_ireplace("'", "''", $str); + } + + /** + * limit + * @access public + * @return string + */ + public function parseLimit($limit) { + $limitStr = ''; + if(!empty($limit)) { + $limit = explode(',',$limit); + if(count($limit)>1) { + $limitStr .= ' LIMIT '.$limit[1].' OFFSET '.$limit[0].' '; + }else{ + $limitStr .= ' LIMIT '.$limit[0].' '; + } + } + return $limitStr; + } +} diff --git a/ThinkPHP/Library/Think/Db/Driver/Sqlsrv.class.php b/ThinkPHP/Library/Think/Db/Driver/Sqlsrv.class.php new file mode 100644 index 0000000..9df1c92 --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Driver/Sqlsrv.class.php @@ -0,0 +1,166 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db\Driver; +use Think\Db\Driver; +use PDO; + +/** + * Sqlsrv数据库驱动 + */ +class Sqlsrv extends Driver{ + protected $selectSql = 'SELECT T1.* FROM (SELECT thinkphp.*, ROW_NUMBER() OVER (%ORDER%) AS ROW_NUMBER FROM (SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING% %UNION%) AS thinkphp) AS T1 %LIMIT%%COMMENT%'; + // PDO连接参数 + protected $options = array( + PDO::ATTR_CASE => PDO::CASE_LOWER, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_STRINGIFY_FETCHES => false, + PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8, + ); + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){ + $dsn = 'sqlsrv:Database='.$config['database'].';Server='.$config['hostname']; + if(!empty($config['hostport'])) { + $dsn .= ','.$config['hostport']; + } + return $dsn; + } + + /** + * 取得数据表的字段信息 + * @access public + * @return array + */ + public function getFields($tableName) { + list($tableName) = explode(' ', $tableName); + $result = $this->query("SELECT column_name, data_type, column_default, is_nullable + FROM information_schema.tables AS t + JOIN information_schema.columns AS c + ON t.table_catalog = c.table_catalog + AND t.table_schema = c.table_schema + AND t.table_name = c.table_name + WHERE t.table_name = '$tableName'"); + $info = array(); + if($result) { + foreach ($result as $key => $val) { + $info[$val['column_name']] = array( + 'name' => $val['column_name'], + 'type' => $val['data_type'], + 'notnull' => (bool) ($val['is_nullable'] === ''), // not null is empty, null is yes + 'default' => $val['column_default'], + 'primary' => false, + 'autoinc' => false, + ); + } + } + return $info; + } + + /** + * 取得数据表的字段信息 + * @access public + * @return array + */ + public function getTables($dbName='') { + $result = $this->query("SELECT TABLE_NAME + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_TYPE = 'BASE TABLE' + "); + $info = array(); + foreach ($result as $key => $val) { + $info[$key] = current($val); + } + return $info; + } + + /** + * order分析 + * @access protected + * @param mixed $order + * @return string + */ + protected function parseOrder($order) { + return !empty($order)? ' ORDER BY '.$order:' ORDER BY rand()'; + } + + /** + * 字段名分析 + * @access protected + * @param string $key + * @return string + */ + protected function parseKey(&$key) { + $key = trim($key); + if(!is_numeric($key) && !preg_match('/[,\'\"\*\(\)\[.\s]/',$key)) { + $key = '['.$key.']'; + } + return $key; + } + + /** + * limit + * @access public + * @param mixed $limit + * @return string + */ + public function parseLimit($limit) { + if(empty($limit)) return ''; + $limit = explode(',',$limit); + if(count($limit)>1) + $limitStr = '(T1.ROW_NUMBER BETWEEN '.$limit[0].' + 1 AND '.$limit[0].' + '.$limit[1].')'; + else + $limitStr = '(T1.ROW_NUMBER BETWEEN 1 AND '.$limit[0].")"; + return 'WHERE '.$limitStr; + } + + /** + * 更新记录 + * @access public + * @param mixed $data 数据 + * @param array $options 表达式 + * @return false | integer + */ + public function update($data,$options) { + $this->model = $options['model']; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + $sql = 'UPDATE ' + .$this->parseTable($options['table']) + .$this->parseSet($data) + .$this->parseWhere(!empty($options['where'])?$options['where']:'') + .$this->parseLock(isset($options['lock'])?$options['lock']:false) + .$this->parseComment(!empty($options['comment'])?$options['comment']:''); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + + /** + * 删除记录 + * @access public + * @param array $options 表达式 + * @return false | integer + */ + public function delete($options=array()) { + $this->model = $options['model']; + $this->parseBind(!empty($options['bind'])?$options['bind']:array()); + $sql = 'DELETE FROM ' + .$this->parseTable($options['table']) + .$this->parseWhere(!empty($options['where'])?$options['where']:'') + .$this->parseLock(isset($options['lock'])?$options['lock']:false) + .$this->parseComment(!empty($options['comment'])?$options['comment']:''); + return $this->execute($sql,!empty($options['fetch_sql']) ? true : false); + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Db/Lite.class.php b/ThinkPHP/Library/Think/Db/Lite.class.php new file mode 100644 index 0000000..577c44b --- /dev/null +++ b/ThinkPHP/Library/Think/Db/Lite.class.php @@ -0,0 +1,466 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Db; +use Think\Config; +use Think\Debug; +use Think\Log; +use PDO; + +class Lite { + // PDO操作实例 + protected $PDOStatement = null; + // 当前操作所属的模型名 + protected $model = '_think_'; + // 当前SQL指令 + protected $queryStr = ''; + protected $modelSql = array(); + // 最后插入ID + protected $lastInsID = null; + // 返回或者影响记录数 + protected $numRows = 0; + // 事务指令数 + protected $transTimes = 0; + // 错误信息 + protected $error = ''; + // 数据库连接ID 支持多个连接 + protected $linkID = array(); + // 当前连接ID + protected $_linkID = null; + // 数据库连接参数配置 + protected $config = array( + 'type' => '', // 数据库类型 + 'hostname' => '127.0.0.1', // 服务器地址 + 'database' => '', // 数据库名 + 'username' => '', // 用户名 + 'password' => '', // 密码 + 'hostport' => '', // 端口 + 'dsn' => '', // + 'params' => array(), // 数据库连接参数 + 'charset' => 'utf8', // 数据库编码默认采用utf8 + 'prefix' => '', // 数据库表前缀 + 'debug' => false, // 数据库调试模式 + 'deploy' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'rw_separate' => false, // 数据库读写是否分离 主从式有效 + 'master_num' => 1, // 读写分离后 主服务器数量 + 'slave_no' => '', // 指定从服务器序号 + ); + // 数据库表达式 + protected $comparison = array('eq'=>'=','neq'=>'<>','gt'=>'>','egt'=>'>=','lt'=>'<','elt'=>'<=','notlike'=>'NOT LIKE','like'=>'LIKE','in'=>'IN','notin'=>'NOT IN'); + // 查询表达式 + protected $selectSql = 'SELECT%DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%'; + // 查询次数 + protected $queryTimes = 0; + // 执行次数 + protected $executeTimes = 0; + // PDO连接参数 + protected $options = array( + PDO::ATTR_CASE => PDO::CASE_LOWER, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, + PDO::ATTR_STRINGIFY_FETCHES => false, + ); + + /** + * 架构函数 读取数据库配置信息 + * @access public + * @param array $config 数据库配置数组 + */ + public function __construct($config=''){ + if(!empty($config)) { + $this->config = array_merge($this->config,$config); + if(is_array($this->config['params'])){ + $this->options += $this->config['params']; + } + } + } + + /** + * 连接数据库方法 + * @access public + */ + public function connect($config='',$linkNum=0) { + if ( !isset($this->linkID[$linkNum]) ) { + if(empty($config)) $config = $this->config; + try{ + if(empty($config['dsn'])) { + $config['dsn'] = $this->parseDsn($config); + } + if(version_compare(PHP_VERSION,'5.3.6','<=')){ //禁用模拟预处理语句 + $this->options[PDO::ATTR_EMULATE_PREPARES] = false; + } + $this->linkID[$linkNum] = new PDO( $config['dsn'], $config['username'], $config['password'],$this->options); + }catch (\PDOException $e) { + E($e->getMessage()); + } + } + return $this->linkID[$linkNum]; + } + + /** + * 解析pdo连接的dsn信息 + * @access public + * @param array $config 连接信息 + * @return string + */ + protected function parseDsn($config){} + + /** + * 释放查询结果 + * @access public + */ + public function free() { + $this->PDOStatement = null; + } + + /** + * 执行查询 返回数据集 + * @access public + * @param string $str sql指令 + * @param array $bind 参数绑定 + * @return mixed + */ + public function query($str,$bind=array()) { + $this->initConnect(false); + if ( !$this->_linkID ) return false; + $this->queryStr = $str; + if(!empty($bind)){ + $that = $this; + $this->queryStr = strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$bind)); + } + //释放前次的查询结果 + if ( !empty($this->PDOStatement) ) $this->free(); + $this->queryTimes++; + N('db_query',1); // 兼容代码 + // 调试开始 + $this->debug(true); + $this->PDOStatement = $this->_linkID->prepare($str); + if(false === $this->PDOStatement) + E($this->error()); + foreach ($bind as $key => $val) { + if(is_array($val)){ + $this->PDOStatement->bindValue($key, $val[0], $val[1]); + }else{ + $this->PDOStatement->bindValue($key, $val); + } + } + $result = $this->PDOStatement->execute(); + // 调试结束 + $this->debug(false); + if ( false === $result ) { + $this->error(); + return false; + } else { + return $this->getResult(); + } + } + + /** + * 执行语句 + * @access public + * @param string $str sql指令 + * @param array $bind 参数绑定 + * @return integer + */ + public function execute($str,$bind=array()) { + $this->initConnect(true); + if ( !$this->_linkID ) return false; + $this->queryStr = $str; + if(!empty($bind)){ + $that = $this; + $this->queryStr = strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$bind)); + } + //释放前次的查询结果 + if ( !empty($this->PDOStatement) ) $this->free(); + $this->executeTimes++; + N('db_write',1); // 兼容代码 + // 记录开始执行时间 + $this->debug(true); + $this->PDOStatement = $this->_linkID->prepare($str); + if(false === $this->PDOStatement) { + E($this->error()); + } + foreach ($bind as $key => $val) { + if(is_array($val)){ + $this->PDOStatement->bindValue($key, $val[0], $val[1]); + }else{ + $this->PDOStatement->bindValue($key, $val); + } + } + $result = $this->PDOStatement->execute(); + $this->debug(false); + if ( false === $result) { + $this->error(); + return false; + } else { + $this->numRows = $this->PDOStatement->rowCount(); + if(preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i", $str)) { + $this->lastInsID = $this->_linkID->lastInsertId(); + } + return $this->numRows; + } + } + + /** + * 启动事务 + * @access public + * @return void + */ + public function startTrans() { + $this->initConnect(true); + if ( !$this->_linkID ) return false; + //数据rollback 支持 + if ($this->transTimes == 0) { + $this->_linkID->beginTransaction(); + } + $this->transTimes++; + return ; + } + + /** + * 用于非自动提交状态下面的查询提交 + * @access public + * @return boolean + */ + public function commit() { + if ($this->transTimes > 0) { + $result = $this->_linkID->commit(); + $this->transTimes = 0; + if(!$result){ + $this->error(); + return false; + } + } + return true; + } + + /** + * 事务回滚 + * @access public + * @return boolean + */ + public function rollback() { + if ($this->transTimes > 0) { + $result = $this->_linkID->rollback(); + $this->transTimes = 0; + if(!$result){ + $this->error(); + return false; + } + } + return true; + } + + /** + * 获得所有的查询数据 + * @access private + * @return array + */ + private function getResult() { + //返回数据集 + $result = $this->PDOStatement->fetchAll(PDO::FETCH_ASSOC); + $this->numRows = count( $result ); + return $result; + } + + /** + * 获得查询次数 + * @access public + * @param boolean $execute 是否包含所有查询 + * @return integer + */ + public function getQueryTimes($execute=false){ + return $execute?$this->queryTimes+$this->executeTimes:$this->queryTimes; + } + + /** + * 获得执行次数 + * @access public + * @return integer + */ + public function getExecuteTimes(){ + return $this->executeTimes; + } + + /** + * 关闭数据库 + * @access public + */ + public function close() { + $this->_linkID = null; + } + + /** + * 数据库错误信息 + * 并显示当前的SQL语句 + * @access public + * @return string + */ + public function error() { + if($this->PDOStatement) { + $error = $this->PDOStatement->errorInfo(); + $this->error = $error[1].':'.$error[2]; + }else{ + $this->error = ''; + } + if('' != $this->queryStr){ + $this->error .= "\n [ SQL语句 ] : ".$this->queryStr; + } + // 记录错误日志 + trace($this->error,'','ERR'); + if($this->config['debug']) {// 开启数据库调试模式 + E($this->error); + }else{ + return $this->error; + } + } + + /** + * 获取最近一次查询的sql语句 + * @param string $model 模型名 + * @access public + * @return string + */ + public function getLastSql($model='') { + return $model?$this->modelSql[$model]:$this->queryStr; + } + + /** + * 获取最近插入的ID + * @access public + * @return string + */ + public function getLastInsID() { + return $this->lastInsID; + } + + /** + * 获取最近的错误信息 + * @access public + * @return string + */ + public function getError() { + return $this->error; + } + + /** + * SQL指令安全过滤 + * @access public + * @param string $str SQL字符串 + * @return string + */ + public function escapeString($str) { + return addslashes($str); + } + + /** + * 设置当前操作模型 + * @access public + * @param string $model 模型名 + * @return void + */ + public function setModel($model){ + $this->model = $model; + } + + /** + * 数据库调试 记录当前SQL + * @access protected + * @param boolean $start 调试开始标记 true 开始 false 结束 + */ + protected function debug($start) { + if($this->config['debug']) {// 开启数据库调试模式 + if($start) { + G('queryStartTime'); + }else{ + $this->modelSql[$this->model] = $this->queryStr; + //$this->model = '_think_'; + // 记录操作结束时间 + G('queryEndTime'); + trace($this->queryStr.' [ RunTime:'.G('queryStartTime','queryEndTime').'s ]','','SQL'); + } + } + } + + /** + * 初始化数据库连接 + * @access protected + * @param boolean $master 主服务器 + * @return void + */ + protected function initConnect($master=true) { + if(!empty($this->config['deploy'])) + // 采用分布式数据库 + $this->_linkID = $this->multiConnect($master); + else + // 默认单数据库 + if ( !$this->_linkID ) $this->_linkID = $this->connect(); + } + + /** + * 连接分布式服务器 + * @access protected + * @param boolean $master 主服务器 + * @return void + */ + protected function multiConnect($master=false) { + // 分布式数据库配置解析 + $_config['username'] = explode(',',$this->config['username']); + $_config['password'] = explode(',',$this->config['password']); + $_config['hostname'] = explode(',',$this->config['hostname']); + $_config['hostport'] = explode(',',$this->config['hostport']); + $_config['database'] = explode(',',$this->config['database']); + $_config['dsn'] = explode(',',$this->config['dsn']); + $_config['charset'] = explode(',',$this->config['charset']); + + // 数据库读写是否分离 + if($this->config['rw_separate']){ + // 主从式采用读写分离 + if($master) + // 主服务器写入 + $r = floor(mt_rand(0,$this->config['master_num']-1)); + else{ + if(is_numeric($this->config['slave_no'])) {// 指定服务器读 + $r = $this->config['slave_no']; + }else{ + // 读操作连接从服务器 + $r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1)); // 每次随机连接的数据库 + } + } + }else{ + // 读写操作不区分服务器 + $r = floor(mt_rand(0,count($_config['hostname'])-1)); // 每次随机连接的数据库 + } + $db_config = array( + 'username' => isset($_config['username'][$r])?$_config['username'][$r]:$_config['username'][0], + 'password' => isset($_config['password'][$r])?$_config['password'][$r]:$_config['password'][0], + 'hostname' => isset($_config['hostname'][$r])?$_config['hostname'][$r]:$_config['hostname'][0], + 'hostport' => isset($_config['hostport'][$r])?$_config['hostport'][$r]:$_config['hostport'][0], + 'database' => isset($_config['database'][$r])?$_config['database'][$r]:$_config['database'][0], + 'dsn' => isset($_config['dsn'][$r])?$_config['dsn'][$r]:$_config['dsn'][0], + 'charset' => isset($_config['charset'][$r])?$_config['charset'][$r]:$_config['charset'][0], + ); + return $this->connect($db_config,$r); + } + + /** + * 析构方法 + * @access public + */ + public function __destruct() { + // 释放查询 + if ($this->PDOStatement){ + $this->free(); + } + // 关闭连接 + $this->close(); + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Dispatcher.class.php b/ThinkPHP/Library/Think/Dispatcher.class.php new file mode 100644 index 0000000..0065cfb --- /dev/null +++ b/ThinkPHP/Library/Think/Dispatcher.class.php @@ -0,0 +1,339 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP内置的Dispatcher类 + * 完成URL解析、路由和调度 + */ +class Dispatcher { + + /** + * URL映射到控制器 + * @access public + * @return void + */ + static public function dispatch() { + $varPath = C('VAR_PATHINFO'); + $varAddon = C('VAR_ADDON'); + $varModule = C('VAR_MODULE'); + $varController = C('VAR_CONTROLLER'); + $varAction = C('VAR_ACTION'); + $urlCase = C('URL_CASE_INSENSITIVE'); + if(isset($_GET[$varPath])) { // 判断URL里面是否有兼容模式参数 + $_SERVER['PATH_INFO'] = $_GET[$varPath]; + unset($_GET[$varPath]); + }elseif(IS_CLI){ // CLI模式下 index.php module/controller/action/params/... + $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; + } + + // 开启子域名部署 + if(C('APP_SUB_DOMAIN_DEPLOY')) { + $rules = C('APP_SUB_DOMAIN_RULES'); + if(isset($rules[$_SERVER['HTTP_HOST']])) { // 完整域名或者IP配置 + define('APP_DOMAIN',$_SERVER['HTTP_HOST']); // 当前完整域名 + $rule = $rules[APP_DOMAIN]; + }else{ + if(strpos(C('APP_DOMAIN_SUFFIX'),'.')){ // com.cn net.cn + $domain = array_slice(explode('.', $_SERVER['HTTP_HOST']), 0, -3); + }else{ + $domain = array_slice(explode('.', $_SERVER['HTTP_HOST']), 0, -2); + } + if(!empty($domain)) { + $subDomain = implode('.', $domain); + define('SUB_DOMAIN',$subDomain); // 当前完整子域名 + $domain2 = array_pop($domain); // 二级域名 + if($domain) { // 存在三级域名 + $domain3 = array_pop($domain); + } + if(isset($rules[$subDomain])) { // 子域名 + $rule = $rules[$subDomain]; + }elseif(isset($rules['*.' . $domain2]) && !empty($domain3)){ // 泛三级域名 + $rule = $rules['*.' . $domain2]; + $panDomain = $domain3; + }elseif(isset($rules['*']) && !empty($domain2) && 'www' != $domain2 ){ // 泛二级域名 + $rule = $rules['*']; + $panDomain = $domain2; + } + } + } + + if(!empty($rule)) { + // 子域名部署规则 '子域名'=>array('模块名[/控制器名]','var1=a&var2=b'); + if(is_array($rule)){ + list($rule,$vars) = $rule; + } + $array = explode('/',$rule); + // 模块绑定 + define('BIND_MODULE',array_shift($array)); + // 控制器绑定 + if(!empty($array)) { + $controller = array_shift($array); + if($controller){ + define('BIND_CONTROLLER',$controller); + } + } + if(isset($vars)) { // 传入参数 + parse_str($vars,$parms); + if(isset($panDomain)){ + $pos = array_search('*', $parms); + if(false !== $pos) { + // 泛域名作为参数 + $parms[$pos] = $panDomain; + } + } + $_GET = array_merge($_GET,$parms); + } + } + } + // 分析PATHINFO信息 + if(!isset($_SERVER['PATH_INFO'])) { + $types = explode(',',C('URL_PATHINFO_FETCH')); + foreach ($types as $type){ + if(0===strpos($type,':')) {// 支持函数判断 + $_SERVER['PATH_INFO'] = call_user_func(substr($type,1)); + break; + }elseif(!empty($_SERVER[$type])) { + $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type],$_SERVER['SCRIPT_NAME']))? + substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; + break; + } + } + } + + $depr = C('URL_PATHINFO_DEPR'); + define('MODULE_PATHINFO_DEPR', $depr); + + if(empty($_SERVER['PATH_INFO'])) { + $_SERVER['PATH_INFO'] = ''; + define('__INFO__',''); + define('__EXT__',''); + }else{ + define('__INFO__',trim($_SERVER['PATH_INFO'],'/')); + // URL后缀 + define('__EXT__', strtolower(pathinfo($_SERVER['PATH_INFO'],PATHINFO_EXTENSION))); + $_SERVER['PATH_INFO'] = __INFO__; + if(!defined('BIND_MODULE') && (!C('URL_ROUTER_ON') || !Route::check())){ + if (__INFO__ && C('MULTI_MODULE')){ // 获取模块名 + $paths = explode($depr,__INFO__,2); + $allowList = C('MODULE_ALLOW_LIST'); // 允许的模块列表 + $module = preg_replace('/\.' . __EXT__ . '$/i', '',$paths[0]); + if( empty($allowList) || (is_array($allowList) && in_array_case($module, $allowList))){ + $_GET[$varModule] = $module; + $_SERVER['PATH_INFO'] = isset($paths[1])?$paths[1]:''; + } + } + } + } + + // URL常量 + define('__SELF__',strip_tags($_SERVER[C('URL_REQUEST_URI')])); + + // 获取模块名称 + define('MODULE_NAME', defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule)); + + // 检测模块是否存在 + if( MODULE_NAME && (defined('BIND_MODULE') || !in_array_case(MODULE_NAME,C('MODULE_DENY_LIST')) ) && is_dir(APP_PATH.MODULE_NAME)){ + // 定义当前模块路径 + define('MODULE_PATH', APP_PATH.MODULE_NAME.'/'); + // 定义当前模块的模版缓存路径 + C('CACHE_PATH',CACHE_PATH.MODULE_NAME.'/'); + // 定义当前模块的日志目录 + C('LOG_PATH', realpath(LOG_PATH).'/'.MODULE_NAME.'/'); + + // 模块检测 + Hook::listen('module_check'); + + // 加载模块配置文件 + if(is_file(MODULE_PATH.'Conf/config'.CONF_EXT)) + C(load_config(MODULE_PATH.'Conf/config'.CONF_EXT)); + // 加载应用模式对应的配置文件 + if('common' != APP_MODE && is_file(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT)) + C(load_config(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT)); + // 当前应用状态对应的配置文件 + if(APP_STATUS && is_file(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT)) + C(load_config(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT)); + + // 加载模块别名定义 + if(is_file(MODULE_PATH.'Conf/alias.php')) + Think::addMap(include MODULE_PATH.'Conf/alias.php'); + // 加载模块tags文件定义 + if(is_file(MODULE_PATH.'Conf/tags.php')) + Hook::import(include MODULE_PATH.'Conf/tags.php'); + // 加载模块函数文件 + if(is_file(MODULE_PATH.'Common/function.php')) + include MODULE_PATH.'Common/function.php'; + + $urlCase = C('URL_CASE_INSENSITIVE'); + // 加载模块的扩展配置文件 + load_ext_file(MODULE_PATH); + }else{ + E(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME); + } + + if(!defined('__APP__')){ + $urlMode = C('URL_MODEL'); + if($urlMode == URL_COMPAT ){// 兼容模式判断 + define('PHP_FILE',_PHP_FILE_.'?'.$varPath.'='); + }elseif($urlMode == URL_REWRITE ) { + $url = dirname(_PHP_FILE_); + if($url == '/' || $url == '\\') + $url = ''; + define('PHP_FILE',$url); + }else { + define('PHP_FILE',_PHP_FILE_); + } + // 当前应用地址 + define('__APP__',strip_tags(PHP_FILE)); + } + // 模块URL地址 + $moduleName = defined('MODULE_ALIAS')? MODULE_ALIAS : MODULE_NAME; + define('__MODULE__',(defined('BIND_MODULE') || !C('MULTI_MODULE'))? __APP__ : __APP__.'/'.($urlCase ? strtolower($moduleName) : $moduleName)); + + if('' != $_SERVER['PATH_INFO'] && (!C('URL_ROUTER_ON') || !Route::check()) ){ // 检测路由规则 如果没有则按默认规则调度URL + Hook::listen('path_info'); + // 检查禁止访问的URL后缀 + if(C('URL_DENY_SUFFIX') && preg_match('/\.('.trim(C('URL_DENY_SUFFIX'),'.').')$/i', $_SERVER['PATH_INFO'])){ + send_http_status(404); + exit; + } + + // 去除URL后缀 + $_SERVER['PATH_INFO'] = preg_replace(C('URL_HTML_SUFFIX')? '/\.('.trim(C('URL_HTML_SUFFIX'),'.').')$/i' : '/\.'.__EXT__.'$/i', '', $_SERVER['PATH_INFO']); + + $depr = C('URL_PATHINFO_DEPR'); + $paths = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); + + if(!defined('BIND_CONTROLLER')) {// 获取控制器 + if(C('CONTROLLER_LEVEL')>1){// 控制器层次 + $_GET[$varController] = implode('/',array_slice($paths,0,C('CONTROLLER_LEVEL'))); + $paths = array_slice($paths, C('CONTROLLER_LEVEL')); + }else{ + $_GET[$varController] = array_shift($paths); + } + } + // 获取操作 + if(!defined('BIND_ACTION')){ + $_GET[$varAction] = array_shift($paths); + } + // 解析剩余的URL参数 + $var = array(); + if(C('URL_PARAMS_BIND') && 1 == C('URL_PARAMS_BIND_TYPE')){ + // URL参数按顺序绑定变量 + $var = $paths; + }else{ + preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){$var[$match[1]]=strip_tags($match[2]);}, implode('/',$paths)); + } + $_GET = array_merge($var,$_GET); + } + // 获取控制器的命名空间(路径) + define('CONTROLLER_PATH', self::getSpace($varAddon,$urlCase)); + // 获取控制器和操作名 + define('CONTROLLER_NAME', defined('BIND_CONTROLLER')? BIND_CONTROLLER : self::getController($varController,$urlCase)); + define('ACTION_NAME', defined('BIND_ACTION')? BIND_ACTION : self::getAction($varAction,$urlCase)); + + // 当前控制器的UR地址 + $controllerName = defined('CONTROLLER_ALIAS')? CONTROLLER_ALIAS : CONTROLLER_NAME; + define('__CONTROLLER__',__MODULE__.$depr.(defined('BIND_CONTROLLER')? '': ( $urlCase ? parse_name($controllerName) : $controllerName )) ); + + // 当前操作的URL地址 + define('__ACTION__',__CONTROLLER__.$depr.(defined('ACTION_ALIAS')?ACTION_ALIAS:ACTION_NAME)); + + //保证$_REQUEST正常取值 + $_REQUEST = array_merge($_POST,$_GET,$_COOKIE); // -- 加了$_COOKIE. 保证哦.. + } + + /** + * 获得控制器的命名空间路径 便于插件机制访问 + */ + static private function getSpace($var,$urlCase) { + $space = !empty($_GET[$var])?strip_tags($_GET[$var]):''; + unset($_GET[$var]); + return $space; + } + + /** + * 获得实际的控制器名称 + */ + static private function getController($var,$urlCase) { + $controller = (!empty($_GET[$var])? $_GET[$var]:C('DEFAULT_CONTROLLER')); + unset($_GET[$var]); + if($maps = C('URL_CONTROLLER_MAP')) { + if(isset($maps[strtolower($controller)])) { + // 记录当前别名 + define('CONTROLLER_ALIAS',strtolower($controller)); + // 获取实际的控制器名 + return ucfirst($maps[CONTROLLER_ALIAS]); + }elseif(array_search(strtolower($controller),$maps)){ + // 禁止访问原始控制器 + return ''; + } + } + if($urlCase) { + // URL地址不区分大小写 + // 智能识别方式 user_type 识别到 UserTypeController 控制器 + $controller = parse_name($controller,1); + } + return strip_tags(ucfirst($controller)); + } + + /** + * 获得实际的操作名称 + */ + static private function getAction($var,$urlCase) { + $action = !empty($_POST[$var]) ? + $_POST[$var] : + (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_ACTION')); + unset($_POST[$var],$_GET[$var]); + if($maps = C('URL_ACTION_MAP')) { + if(isset($maps[strtolower(CONTROLLER_NAME)])) { + $maps = $maps[strtolower(CONTROLLER_NAME)]; + if(isset($maps[strtolower($action)])) { + // 记录当前别名 + define('ACTION_ALIAS',strtolower($action)); + // 获取实际的操作名 + if(is_array($maps[ACTION_ALIAS])){ + parse_str($maps[ACTION_ALIAS][1],$vars); + $_GET = array_merge($_GET,$vars); + return $maps[ACTION_ALIAS][0]; + }else{ + return $maps[ACTION_ALIAS]; + } + + }elseif(array_search(strtolower($action),$maps)){ + // 禁止访问原始操作 + return ''; + } + } + } + return strip_tags( $urlCase? strtolower($action) : $action ); + } + + /** + * 获得实际的模块名称 + */ + static private function getModule($var) { + $module = (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_MODULE')); + unset($_GET[$var]); + if($maps = C('URL_MODULE_MAP')) { + if(isset($maps[strtolower($module)])) { + // 记录当前别名 + define('MODULE_ALIAS',strtolower($module)); + // 获取实际的模块名 + return ucfirst($maps[MODULE_ALIAS]); + }elseif(array_search(strtolower($module),$maps)){ + // 禁止访问原始模块 + return ''; + } + } + return strip_tags(ucfirst($module)); + } + +} diff --git a/application/route.php b/ThinkPHP/Library/Think/Exception.class.php similarity index 70% rename from application/route.php rename to ThinkPHP/Library/Think/Exception.class.php index 3cb7606..7b4a918 100644 --- a/application/route.php +++ b/ThinkPHP/Library/Think/Exception.class.php @@ -1,15 +1,16 @@ <?php // +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- - -use \think\Route; - -//Route::get('/','Index/Index/index'); -//Route::get('/','Index/User/index'); +namespace Think; +/** + * ThinkPHP系统异常基类 + */ +class Exception extends \Exception { +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Hook.class.php b/ThinkPHP/Library/Think/Hook.class.php new file mode 100644 index 0000000..51176c7 --- /dev/null +++ b/ThinkPHP/Library/Think/Hook.class.php @@ -0,0 +1,121 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006~2013 http://topthink.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP系统钩子实现 + */ +class Hook { + + static private $tags = array(); + + /** + * 动态添加插件到某个标签 + * @param string $tag 标签名称 + * @param mixed $name 插件名称 + * @return void + */ + static public function add($tag,$name) { + if(!isset(self::$tags[$tag])){ + self::$tags[$tag] = array(); + } + if(is_array($name)){ + self::$tags[$tag] = array_merge(self::$tags[$tag],$name); + }else{ + self::$tags[$tag][] = $name; + } + } + + /** + * 批量导入插件 + * @param array $data 插件信息 + * @param boolean $recursive 是否递归合并 + * @return void + */ + static public function import($data,$recursive=true) { + if(!$recursive){ // 覆盖导入 + self::$tags = array_merge(self::$tags,$data); + }else{ // 合并导入 + foreach ($data as $tag=>$val){ + if(!isset(self::$tags[$tag])) + self::$tags[$tag] = array(); + if(!empty($val['_overlay'])){ + // 可以针对某个标签指定覆盖模式 + unset($val['_overlay']); + self::$tags[$tag] = $val; + }else{ + // 合并模式 + self::$tags[$tag] = array_merge(self::$tags[$tag],$val); + } + } + } + } + + /** + * 获取插件信息 + * @param string $tag 插件位置 留空获取全部 + * @return array + */ + static public function get($tag='') { + if(empty($tag)){ + // 获取全部的插件信息 + return self::$tags; + }else{ + return self::$tags[$tag]; + } + } + + /** + * 监听标签的插件 + * @param string $tag 标签名称 + * @param mixed $params 传入参数 + * @return void + */ + static public function listen($tag, &$params=NULL) { + if(isset(self::$tags[$tag])) { + if(APP_DEBUG) { + G($tag.'Start'); + trace('[ '.$tag.' ] --START--','','INFO'); + } + foreach (self::$tags[$tag] as $name) { + APP_DEBUG && G($name.'_start'); + $result = self::exec($name, $tag,$params); + if(APP_DEBUG){ + G($name.'_end'); + trace('Run '.$name.' [ RunTime:'.G($name.'_start',$name.'_end',6).'s ]','','INFO'); + } + if(false === $result) { + // 如果返回false 则中断插件执行 + return ; + } + } + if(APP_DEBUG) { // 记录行为的执行日志 + trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO'); + } + } + return; + } + + /** + * 执行某个插件 + * @param string $name 插件名称 + * @param string $tag 方法名(标签名) + * @param Mixed $params 传入的参数 + * @return void + */ + static public function exec($name, $tag,&$params=NULL) { + if('Behavior' == substr($name,-8) ){ + // 行为扩展必须用run入口方法 + $tag = 'run'; + } + $addon = new $name(); + return $addon->$tag($params); + } +} diff --git a/ThinkPHP/Library/Think/Log.class.php b/ThinkPHP/Library/Think/Log.class.php new file mode 100644 index 0000000..09b1155 --- /dev/null +++ b/ThinkPHP/Library/Think/Log.class.php @@ -0,0 +1,104 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * 日志处理类 + */ +class Log { + + // 日志级别 从上到下,由低到高 + const EMERG = 'EMERG'; // 严重错误: 导致系统崩溃无法使用 + const ALERT = 'ALERT'; // 警戒性错误: 必须被立即修改的错误 + const CRIT = 'CRIT'; // 临界值错误: 超过临界值的错误,例如一天24小时,而输入的是25小时这样 + const ERR = 'ERR'; // 一般错误: 一般性错误 + const WARN = 'WARN'; // 警告性错误: 需要发出警告的错误 + const NOTICE = 'NOTIC'; // 通知: 程序可以运行但是还不够完美的错误 + const INFO = 'INFO'; // 信息: 程序输出信息 + const DEBUG = 'DEBUG'; // 调试: 调试信息 + const SQL = 'SQL'; // SQL:SQL语句 注意只在调试模式开启时有效 + + // 日志信息 + static protected $log = array(); + + // 日志存储 + static protected $storage = null; + + // 日志初始化 + static public function init($config=array()){ + $type = isset($config['type']) ? $config['type'] : 'File'; + $class = strpos($type,'\\')? $type: 'Think\\Log\\Driver\\'. ucwords(strtolower($type)); + unset($config['type']); + self::$storage = new $class($config); + } + + /** + * 记录日志 并且会过滤未经设置的级别 + * @static + * @access public + * @param string $message 日志信息 + * @param string $level 日志级别 + * @param boolean $record 是否强制记录 + * @return void + */ + static function record($message,$level=self::ERR,$record=false) { + if($record || false !== strpos(C('LOG_LEVEL'),$level)) { + self::$log[] = "{$level}: {$message}\r\n"; + } + } + + /** + * 日志保存 + * @static + * @access public + * @param integer $type 日志记录方式 + * @param string $destination 写入目标 + * @return void + */ + static function save($type='',$destination='') { + if(empty(self::$log)) return ; + + if(empty($destination)){ + $destination = C('LOG_PATH').date('y_m_d').'.log'; + } + if(!self::$storage){ + $type = $type ? : C('LOG_TYPE'); + $class = 'Think\\Log\\Driver\\'. ucwords($type); + self::$storage = new $class(); + } + $message = implode('',self::$log); + self::$storage->write($message,$destination); + // 保存后清空日志缓存 + self::$log = array(); + } + + /** + * 日志直接写入 + * @static + * @access public + * @param string $message 日志信息 + * @param string $level 日志级别 + * @param integer $type 日志记录方式 + * @param string $destination 写入目标 + * @return void + */ + static function write($message,$level=self::ERR,$type='',$destination='') { + if(!self::$storage){ + $type = $type ? : C('LOG_TYPE'); + $class = 'Think\\Log\\Driver\\'. ucwords($type); + $config['log_path'] = C('LOG_PATH'); + self::$storage = new $class($config); + } + if(empty($destination)){ + $destination = C('LOG_PATH').date('y_m_d').'.log'; + } + self::$storage->write("{$level}: {$message}", $destination); + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Log/Driver/File.class.php b/ThinkPHP/Library/Think/Log/Driver/File.class.php new file mode 100644 index 0000000..290746e --- /dev/null +++ b/ThinkPHP/Library/Think/Log/Driver/File.class.php @@ -0,0 +1,50 @@ +<?php +// +---------------------------------------------------------------------- +// | TOPThink [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2011 http://topthink.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think\Log\Driver; + +class File { + + protected $config = array( + 'log_time_format' => ' c ', + 'log_file_size' => 2097152, + 'log_path' => '', + ); + + // 实例化并传入参数 + public function __construct($config=array()){ + $this->config = array_merge($this->config,$config); + } + + /** + * 日志写入接口 + * @access public + * @param string $log 日志信息 + * @param string $destination 写入目标 + * @return void + */ + public function write($log,$destination='') { + $now = date($this->config['log_time_format']); + if(empty($destination)){ + $destination = $this->config['log_path'].date('y_m_d').'.log'; + } + // 自动创建日志目录 + $log_dir = dirname($destination); + if (!is_dir($log_dir)) { + mkdir($log_dir, 0755, true); + } + //检测日志文件大小,超过配置大小则备份日志文件重新生成 + if(is_file($destination) && floor($this->config['log_file_size']) <= filesize($destination) ){ + rename($destination,dirname($destination).'/'.time().'-'.basename($destination)); + } + error_log("[{$now}] ".$_SERVER['REMOTE_ADDR'].' '.$_SERVER['REQUEST_URI']."\r\n{$log}\r\n", 3,$destination); + } +} diff --git a/ThinkPHP/Library/Think/Log/Driver/Sae.class.php b/ThinkPHP/Library/Think/Log/Driver/Sae.class.php new file mode 100644 index 0000000..accbcae --- /dev/null +++ b/ThinkPHP/Library/Think/Log/Driver/Sae.class.php @@ -0,0 +1,49 @@ +<?php +// +---------------------------------------------------------------------- +// | TOPThink [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2011 http://topthink.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: luofei614 <weibo.com/luofei614> +// +---------------------------------------------------------------------- + +namespace Think\Log\Driver; + +class Sae { + + protected $config = array( + 'log_time_format' => ' c ', + ); + + // 实例化并传入参数 + public function __construct($config=array()){ + $this->config = array_merge($this->config,$config); + } + + /** + * 日志写入接口 + * @access public + * @param string $log 日志信息 + * @param string $destination 写入目标 + * @return void + */ + public function write($log,$destination='') { + static $is_debug=null; + $now = date($this->config['log_time_format']); + $logstr="[{$now}] ".$_SERVER['REMOTE_ADDR'].' '.$_SERVER['REQUEST_URI']."\r\n{$log}\r\n"; + if(is_null($is_debug)){ + preg_replace('@(\w+)\=([^;]*)@e', '$appSettings[\'\\1\']="\\2";', $_SERVER['HTTP_APPCOOKIE']); + $is_debug = in_array($_SERVER['HTTP_APPVERSION'], explode(',', $appSettings['debug'])) ? true : false; + } + if($is_debug){ + sae_set_display_errors(false);//记录日志不将日志打印出来 + } + sae_debug($logstr); + if($is_debug){ + sae_set_display_errors(true); + } + + } +} diff --git a/ThinkPHP/Library/Think/Model.class.php b/ThinkPHP/Library/Think/Model.class.php new file mode 100644 index 0000000..e56474b --- /dev/null +++ b/ThinkPHP/Library/Think/Model.class.php @@ -0,0 +1,1910 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP Model模型类 + * 实现了ORM和ActiveRecords模式 + */ +class Model { + // 操作状态 + const MODEL_INSERT = 1; // 插入模型数据 + const MODEL_UPDATE = 2; // 更新模型数据 + const MODEL_BOTH = 3; // 包含上面两种方式 + const MUST_VALIDATE = 1; // 必须验证 + const EXISTS_VALIDATE = 0; // 表单存在字段则验证 + const VALUE_VALIDATE = 2; // 表单值不为空则验证 + + // 当前数据库操作对象 + protected $db = null; + // 数据库对象池 + private $_db = array(); + // 主键名称 + protected $pk = 'id'; + // 主键是否自动增长 + protected $autoinc = false; + // 数据表前缀 + protected $tablePrefix = null; + // 模型名称 + protected $name = ''; + // 数据库名称 + protected $dbName = ''; + //数据库配置 + protected $connection = ''; + // 数据表名(不包含表前缀) + protected $tableName = ''; + // 实际数据表名(包含表前缀) + protected $trueTableName = ''; + // 最近错误信息 + protected $error = ''; + // 字段信息 + protected $fields = array(); + // 数据信息 + protected $data = array(); + // 查询表达式参数 + protected $options = array(); + protected $_validate = array(); // 自动验证定义 + protected $_auto = array(); // 自动完成定义 + protected $_map = array(); // 字段映射定义 + protected $_scope = array(); // 命名范围定义 + // 是否自动检测数据表字段信息 + protected $autoCheckFields = true; + // 是否批处理验证 + protected $patchValidate = false; + // 链操作方法列表 + protected $methods = array('strict','order','alias','having','group','lock','distinct','auto','filter','validate','result','token','index','force'); + + /** + * 架构函数 + * 取得DB类的实例对象 字段检查 + * @access public + * @param string $name 模型名称 + * @param string $tablePrefix 表前缀 + * @param mixed $connection 数据库连接信息 + */ + public function __construct($name='',$tablePrefix='',$connection='') { + // 模型初始化 + $this->_initialize(); + // 获取模型名称 + if(!empty($name)) { + if(strpos($name,'.')) { // 支持 数据库名.模型名的 定义 + list($this->dbName,$this->name) = explode('.',$name); + }else{ + $this->name = $name; + } + }elseif(empty($this->name)){ + $this->name = $this->getModelName(); + } + // 设置表前缀 + if(is_null($tablePrefix)) {// 前缀为Null表示没有前缀 + $this->tablePrefix = ''; + }elseif('' != $tablePrefix) { + $this->tablePrefix = $tablePrefix; + }elseif(!isset($this->tablePrefix)){ + $this->tablePrefix = C('DB_PREFIX'); + } + + // 数据库初始化操作 + // 获取数据库操作对象 + // 当前模型有独立的数据库连接信息 + $this->db(0,empty($this->connection)?$connection:$this->connection,true); + } + + /** + * 自动检测数据表信息 + * @access protected + * @return void + */ + protected function _checkTableInfo() { + // 如果不是Model类 自动记录数据表信息 + // 只在第一次执行记录 + if(empty($this->fields)) { + // 如果数据表字段没有定义则自动获取 + if(C('DB_FIELDS_CACHE')) { + $db = $this->dbName?:C('DB_NAME'); + $fields = F('_fields/'.strtolower($db.'.'.$this->tablePrefix.$this->name)); + if($fields) { + $this->fields = $fields; + if(!empty($fields['_pk'])){ + $this->pk = $fields['_pk']; + } + return ; + } + } + // 每次都会读取数据表信息 + $this->flush(); + } + } + + /** + * 获取字段信息并缓存 + * @access public + * @return void + */ + public function flush() { + // 缓存不存在则查询数据表信息 + $this->db->setModel($this->name); + $fields = $this->db->getFields($this->getTableName()); + if(!$fields) { // 无法获取字段信息 + return false; + } + $this->fields = array_keys($fields); + unset($this->fields['_pk']); + foreach ($fields as $key=>$val){ + // 记录字段类型 + $type[$key] = $val['type']; + if($val['primary']) { + // 增加复合主键支持 + if (isset($this->fields['_pk']) && $this->fields['_pk'] != null) { + if (is_string($this->fields['_pk'])) { + $this->pk = array($this->fields['_pk']); + $this->fields['_pk'] = $this->pk; + } + $this->pk[] = $key; + $this->fields['_pk'][] = $key; + } else { + $this->pk = $key; + $this->fields['_pk'] = $key; + } + if($val['autoinc']) $this->autoinc = true; + } + } + // 记录字段类型信息 + $this->fields['_type'] = $type; + + // 2008-3-7 增加缓存开关控制 + if(C('DB_FIELDS_CACHE')){ + // 永久缓存数据表信息 + $db = $this->dbName?:C('DB_NAME'); + F('_fields/'.strtolower($db.'.'.$this->tablePrefix.$this->name),$this->fields); + } + } + + /** + * 设置数据对象的值 + * @access public + * @param string $name 名称 + * @param mixed $value 值 + * @return void + */ + public function __set($name,$value) { + // 设置数据对象属性 + $this->data[$name] = $value; + } + + /** + * 获取数据对象的值 + * @access public + * @param string $name 名称 + * @return mixed + */ + public function __get($name) { + return isset($this->data[$name])?$this->data[$name]:null; + } + + /** + * 检测数据对象的值 + * @access public + * @param string $name 名称 + * @return boolean + */ + public function __isset($name) { + return isset($this->data[$name]); + } + + /** + * 销毁数据对象的值 + * @access public + * @param string $name 名称 + * @return void + */ + public function __unset($name) { + unset($this->data[$name]); + } + + /** + * 利用__call方法实现一些特殊的Model方法 + * @access public + * @param string $method 方法名称 + * @param array $args 调用参数 + * @return mixed + */ + public function __call($method,$args) { + if(in_array(strtolower($method),$this->methods,true)) { + // 连贯操作的实现 + $this->options[strtolower($method)] = $args[0]; + return $this; + }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){ + // 统计查询的实现 + $field = isset($args[0])?$args[0]:'*'; + return $this->getField(strtoupper($method).'('.$field.') AS tp_'.$method); + }elseif(strtolower(substr($method,0,5))=='getby') { + // 根据某个字段获取记录 + $field = parse_name(substr($method,5)); + $where[$field] = $args[0]; + return $this->where($where)->find(); + }elseif(strtolower(substr($method,0,10))=='getfieldby') { + // 根据某个字段获取记录的某个值 + $name = parse_name(substr($method,10)); + $where[$name] =$args[0]; + return $this->where($where)->getField($args[1]); + }elseif(isset($this->_scope[$method])){// 命名范围的单独调用支持 + return $this->scope($method,$args[0]); + }else{ + E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); + return; + } + } + // 回调方法 初始化模型 + protected function _initialize() {} + + /** + * 对保存到数据库的数据进行处理 + * @access protected + * @param mixed $data 要操作的数据 + * @return boolean + */ + protected function _facade($data) { + + // 检查数据字段合法性 + if(!empty($this->fields)) { + if(!empty($this->options['field'])) { + $fields = $this->options['field']; + unset($this->options['field']); + if(is_string($fields)) { + $fields = explode(',',$fields); + } + }else{ + $fields = $this->fields; + } + foreach ($data as $key=>$val){ + if(!in_array($key,$fields,true)){ + if(!empty($this->options['strict'])){ + E(L('_DATA_TYPE_INVALID_').':['.$key.'=>'.$val.']'); + } + unset($data[$key]); + }elseif(is_scalar($val)) { + // 字段类型检查 和 强制转换 + $this->_parseType($data,$key); + } + } + } + + // 安全过滤 + if(!empty($this->options['filter'])) { + $data = array_map($this->options['filter'],$data); + unset($this->options['filter']); + } + $this->_before_write($data); + return $data; + } + + // 写入数据前的回调方法 包括新增和更新 + protected function _before_write(&$data) {} + + /** + * 新增数据 + * @access public + * @param mixed $data 数据 + * @param array $options 表达式 + * @param boolean $replace 是否replace + * @return mixed + */ + public function add($data='',$options=array(),$replace=false) { + if(empty($data)) { + // 没有传递数据,获取当前数据对象的值 + if(!empty($this->data)) { + $data = $this->data; + // 重置数据 + $this->data = array(); + }else{ + $this->error = L('_DATA_TYPE_INVALID_'); + return false; + } + } + // 数据处理 + $data = $this->_facade($data); + // 分析表达式 + $options = $this->_parseOptions($options); + if(false === $this->_before_insert($data,$options)) { + return false; + } + // 写入数据到数据库 + $result = $this->db->insert($data,$options,$replace); + if(false !== $result && is_numeric($result)) { + $pk = $this->getPk(); + // 增加复合主键支持 + if (is_array($pk)) return $result; + $insertId = $this->getLastInsID(); + if($insertId) { + // 自增主键返回插入ID + $data[$pk] = $insertId; + if(false === $this->_after_insert($data,$options)) { + return false; + } + return $insertId; + } + if(false === $this->_after_insert($data,$options)) { + return false; + } + } + return $result; + } + // 插入数据前的回调方法 + protected function _before_insert(&$data,$options) {} + // 插入成功后的回调方法 + protected function _after_insert($data,$options) {} + + public function addAll($dataList,$options=array(),$replace=false){ + if(empty($dataList)) { + $this->error = L('_DATA_TYPE_INVALID_'); + return false; + } + // 数据处理 + foreach ($dataList as $key=>$data){ + $dataList[$key] = $this->_facade($data); + } + // 分析表达式 + $options = $this->_parseOptions($options); + // 写入数据到数据库 + $result = $this->db->insertAll($dataList,$options,$replace); + if(false !== $result ) { + $insertId = $this->getLastInsID(); + if($insertId) { + return $insertId; + } + } + return $result; + } + + /** + * 通过Select方式添加记录 + * @access public + * @param string $fields 要插入的数据表字段名 + * @param string $table 要插入的数据表名 + * @param array $options 表达式 + * @return boolean + */ + public function selectAdd($fields='',$table='',$options=array()) { + // 分析表达式 + $options = $this->_parseOptions($options); + // 写入数据到数据库 + if(false === $result = $this->db->selectInsert($fields?:$options['field'],$table?:$this->getTableName(),$options)){ + // 数据库插入操作失败 + $this->error = L('_OPERATION_WRONG_'); + return false; + }else { + // 插入成功 + return $result; + } + } + + /** + * 保存数据 + * @access public + * @param mixed $data 数据 + * @param array $options 表达式 + * @return boolean + */ + public function save($data='',$options=array()) { + if(empty($data)) { + // 没有传递数据,获取当前数据对象的值 + if(!empty($this->data)) { + $data = $this->data; + // 重置数据 + $this->data = array(); + }else{ + $this->error = L('_DATA_TYPE_INVALID_'); + return false; + } + } + // 数据处理 + $data = $this->_facade($data); + if(empty($data)){ + // 没有数据则不执行 + $this->error = L('_DATA_TYPE_INVALID_'); + return false; + } + // 分析表达式 + $options = $this->_parseOptions($options); + $pk = $this->getPk(); + if(!isset($options['where']) ) { + // 如果存在主键数据 则自动作为更新条件 + if (is_string($pk) && isset($data[$pk])) { + $where[$pk] = $data[$pk]; + unset($data[$pk]); + } elseif (is_array($pk)) { + // 增加复合主键支持 + foreach ($pk as $field) { + if(isset($data[$field])) { + $where[$field] = $data[$field]; + } else { + // 如果缺少复合主键数据则不执行 + $this->error = L('_OPERATION_WRONG_'); + return false; + } + unset($data[$field]); + } + } + if(!isset($where)){ + // 如果没有任何更新条件则不执行 + $this->error = L('_OPERATION_WRONG_'); + return false; + }else{ + $options['where'] = $where; + } + } + + if(is_array($options['where']) && isset($options['where'][$pk])){ + $pkValue = $options['where'][$pk]; + } + if(false === $this->_before_update($data,$options)) { + return false; + } + $result = $this->db->update($data,$options); + if(false !== $result && is_numeric($result)) { + if(isset($pkValue)) $data[$pk] = $pkValue; + $this->_after_update($data,$options); + } + return $result; + } + // 更新数据前的回调方法 + protected function _before_update(&$data,$options) {} + // 更新成功后的回调方法 + protected function _after_update($data,$options) {} + + /** + * 删除数据 + * @access public + * @param mixed $options 表达式 + * @return mixed + */ + public function delete($options=array()) { + $pk = $this->getPk(); + if(empty($options) && empty($this->options['where'])) { + // 如果删除条件为空 则删除当前数据对象所对应的记录 + if(!empty($this->data) && isset($this->data[$pk])) + return $this->delete($this->data[$pk]); + else + return false; + } + if(is_numeric($options) || is_string($options)) { + // 根据主键删除记录 + if(strpos($options,',')) { + $where[$pk] = array('IN', $options); + }else{ + $where[$pk] = $options; + } + $options = array(); + $options['where'] = $where; + } + // 根据复合主键删除记录 + if (is_array($options) && (count($options) > 0) && is_array($pk)) { + $count = 0; + foreach (array_keys($options) as $key) { + if (is_int($key)) $count++; + } + if ($count == count($pk)) { + $i = 0; + foreach ($pk as $field) { + $where[$field] = $options[$i]; + unset($options[$i++]); + } + $options['where'] = $where; + } else { + return false; + } + } + // 分析表达式 + $options = $this->_parseOptions($options); + if(empty($options['where'])){ + // 如果条件为空 不进行删除操作 除非设置 1=1 + return false; + } + if(is_array($options['where']) && isset($options['where'][$pk])){ + $pkValue = $options['where'][$pk]; + } + + if(false === $this->_before_delete($options)) { + return false; + } + $result = $this->db->delete($options); + if(false !== $result && is_numeric($result)) { + $data = array(); + if(isset($pkValue)) $data[$pk] = $pkValue; + $this->_after_delete($data,$options); + } + // 返回删除记录个数 + return $result; + } + // 删除数据前的回调方法 + protected function _before_delete($options) {} + // 删除成功后的回调方法 + protected function _after_delete($data,$options) {} + + /** + * 查询数据集 + * @access public + * @param array $options 表达式参数 + * @return mixed + */ + public function select($options=array()) { + $pk = $this->getPk(); + if(is_string($options) || is_numeric($options)) { + // 根据主键查询 + if(strpos($options,',')) { + $where[$pk] = array('IN',$options); + }else{ + $where[$pk] = $options; + } + $options = array(); + $options['where'] = $where; + }elseif (is_array($options) && (count($options) > 0) && is_array($pk)) { + // 根据复合主键查询 + $count = 0; + foreach (array_keys($options) as $key) { + if (is_int($key)) $count++; + } + if ($count == count($pk)) { + $i = 0; + foreach ($pk as $field) { + $where[$field] = $options[$i]; + unset($options[$i++]); + } + $options['where'] = $where; + } else { + return false; + } + } elseif(false === $options){ // 用于子查询 不查询只返回SQL + $options['fetch_sql'] = true; + } + // 分析表达式 + $options = $this->_parseOptions($options); + // 判断查询缓存 + if(isset($options['cache'])){ + $cache = $options['cache']; + $key = is_string($cache['key'])?$cache['key']:md5(serialize($options)); + $data = S($key,'',$cache); + if(false !== $data){ + return $data; + } + } + $resultSet = $this->db->select($options); + if(false === $resultSet) { + return false; + } + if(!empty($resultSet)) { // 有查询结果 + if(is_string($resultSet)){ + return $resultSet; + } + + $resultSet = array_map(array($this,'_read_data'),$resultSet); + $this->_after_select($resultSet,$options); + if(isset($options['index'])){ // 对数据集进行索引 + $index = explode(',',$options['index']); + foreach ($resultSet as $result){ + $_key = $result[$index[0]]; + if(isset($index[1]) && isset($result[$index[1]])){ + $cols[$_key] = $result[$index[1]]; + }else{ + $cols[$_key] = $result; + } + } + $resultSet = $cols; + } + } + + if(isset($cache)){ + S($key,$resultSet,$cache); + } + return $resultSet; + } + // 查询成功后的回调方法 + protected function _after_select(&$resultSet,$options) {} + + /** + * 生成查询SQL 可用于子查询 + * @access public + * @return string + */ + public function buildSql() { + return '( '.$this->fetchSql(true)->select().' )'; + } + + /** + * 分析表达式 + * @access protected + * @param array $options 表达式参数 + * @return array + */ + protected function _parseOptions($options=array()) { + if(is_array($options)) + $options = array_merge($this->options,$options); + + if(!isset($options['table'])){ + // 自动获取表名 + $options['table'] = $this->getTableName(); + $fields = $this->fields; + }else{ + // 指定数据表 则重新获取字段列表 但不支持类型检测 + $fields = $this->getDbFields(); + } + + // 数据表别名 + if(!empty($options['alias'])) { + $options['table'] .= ' '.$options['alias']; + } + // 记录操作的模型名称 + $options['model'] = $this->name; + + // 字段类型验证 + if(isset($options['where']) && is_array($options['where']) && !empty($fields) && !isset($options['join'])) { + // 对数组查询条件进行字段类型检查 + foreach ($options['where'] as $key=>$val){ + $key = trim($key); + if(in_array($key,$fields,true)){ + if(is_scalar($val)) { + $this->_parseType($options['where'],$key); + } + }elseif(!is_numeric($key) && '_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&')){ + if(!empty($this->options['strict'])){ + E(L('_ERROR_QUERY_EXPRESS_').':['.$key.'=>'.$val.']'); + } + unset($options['where'][$key]); + } + } + } + // 查询过后清空sql表达式组装 避免影响下次查询 + $this->options = array(); + // 表达式过滤 + $this->_options_filter($options); + return $options; + } + // 表达式过滤回调方法 + protected function _options_filter(&$options) {} + + /** + * 数据类型检测 + * @access protected + * @param mixed $data 数据 + * @param string $key 字段名 + * @return void + */ + protected function _parseType(&$data,$key) { + if(!isset($this->options['bind'][':'.$key]) && isset($this->fields['_type'][$key])){ + $fieldType = strtolower($this->fields['_type'][$key]); + if(false !== strpos($fieldType,'enum')){ + // 支持ENUM类型优先检测 + }elseif(false === strpos($fieldType,'bigint') && false !== strpos($fieldType,'int')) { + $data[$key] = intval($data[$key]); + }elseif(false !== strpos($fieldType,'float') || false !== strpos($fieldType,'double')){ + $data[$key] = floatval($data[$key]); + }elseif(false !== strpos($fieldType,'bool')){ + $data[$key] = (bool)$data[$key]; + } + } + } + + /** + * 数据读取后的处理 + * @access protected + * @param array $data 当前数据 + * @return array + */ + protected function _read_data($data) { + // 检查字段映射 + if(!empty($this->_map) && C('READ_DATA_MAP')) { + foreach ($this->_map as $key=>$val){ + if(isset($data[$val])) { + $data[$key] = $data[$val]; + unset($data[$val]); + } + } + } + return $data; + } + + /** + * 查询数据 + * @access public + * @param mixed $options 表达式参数 + * @return mixed + */ + public function find($options=array()) { + if(is_numeric($options) || is_string($options)) { + $where[$this->getPk()] = $options; + $options = array(); + $options['where'] = $where; + } + // 根据复合主键查找记录 + $pk = $this->getPk(); + if (is_array($options) && (count($options) > 0) && is_array($pk)) { + // 根据复合主键查询 + $count = 0; + foreach (array_keys($options) as $key) { + if (is_int($key)) $count++; + } + if ($count == count($pk)) { + $i = 0; + foreach ($pk as $field) { + $where[$field] = $options[$i]; + unset($options[$i++]); + } + $options['where'] = $where; + } else { + return false; + } + } + // 总是查找一条记录 + $options['limit'] = 1; + // 分析表达式 + $options = $this->_parseOptions($options); + // 判断查询缓存 + if(isset($options['cache'])){ + $cache = $options['cache']; + $key = is_string($cache['key'])?$cache['key']:md5(serialize($options)); + $data = S($key,'',$cache); + if(false !== $data){ + $this->data = $data; + return $data; + } + } + $resultSet = $this->db->select($options); + if(false === $resultSet) { + return false; + } + if(empty($resultSet)) {// 查询结果为空 + return null; + } + if(is_string($resultSet)){ + return $resultSet; + } + + // 读取数据后的处理 + $data = $this->_read_data($resultSet[0]); + $this->_after_find($data,$options); + if(!empty($this->options['result'])) { + return $this->returnResult($data,$this->options['result']); + } + $this->data = $data; + if(isset($cache)){ + S($key,$data,$cache); + } + return $this->data; + } + // 查询成功的回调方法 + protected function _after_find(&$result,$options) {} + + protected function returnResult($data,$type=''){ + if ($type){ + if(is_callable($type)){ + return call_user_func($type,$data); + } + switch (strtolower($type)){ + case 'json': + return json_encode($data); + case 'xml': + return xml_encode($data); + } + } + return $data; + } + + /** + * 处理字段映射 + * @access public + * @param array $data 当前数据 + * @param integer $type 类型 0 写入 1 读取 + * @return array + */ + public function parseFieldsMap($data,$type=1) { + // 检查字段映射 + if(!empty($this->_map)) { + foreach ($this->_map as $key=>$val){ + if($type==1) { // 读取 + if(isset($data[$val])) { + $data[$key] = $data[$val]; + unset($data[$val]); + } + }else{ + if(isset($data[$key])) { + $data[$val] = $data[$key]; + unset($data[$key]); + } + } + } + } + return $data; + } + + /** + * 设置记录的某个字段值 + * 支持使用数据库字段和方法 + * @access public + * @param string|array $field 字段名 + * @param string $value 字段值 + * @return boolean + */ + public function setField($field,$value='') { + if(is_array($field)) { + $data = $field; + }else{ + $data[$field] = $value; + } + return $this->save($data); + } + + /** + * 字段值增长 + * @access public + * @param string $field 字段名 + * @param integer $step 增长值 + * @param integer $lazyTime 延时时间(s) + * @return boolean + */ + public function setInc($field,$step=1,$lazyTime=0) { + if($lazyTime>0) {// 延迟写入 + $condition = $this->options['where']; + $guid = md5($this->name.'_'.$field.'_'.serialize($condition)); + $step = $this->lazyWrite($guid,$step,$lazyTime); + if(empty($step)) { + return true; // 等待下次写入 + }elseif($step < 0) { + $step = '-'.$step; + } + } + return $this->setField($field,array('exp',$field.'+'.$step)); + } + + /** + * 字段值减少 + * @access public + * @param string $field 字段名 + * @param integer $step 减少值 + * @param integer $lazyTime 延时时间(s) + * @return boolean + */ + public function setDec($field,$step=1,$lazyTime=0) { + if($lazyTime>0) {// 延迟写入 + $condition = $this->options['where']; + $guid = md5($this->name.'_'.$field.'_'.serialize($condition)); + $step = $this->lazyWrite($guid,-$step,$lazyTime); + if(empty($step)) { + return true; // 等待下次写入 + }elseif($step > 0) { + $step = '-'.$step; + } + } + return $this->setField($field,array('exp',$field.'-'.$step)); + } + + /** + * 延时更新检查 返回false表示需要延时 + * 否则返回实际写入的数值 + * @access public + * @param string $guid 写入标识 + * @param integer $step 写入步进值 + * @param integer $lazyTime 延时时间(s) + * @return false|integer + */ + protected function lazyWrite($guid,$step,$lazyTime) { + if(false !== ($value = S($guid))) { // 存在缓存写入数据 + if(NOW_TIME > S($guid.'_time')+$lazyTime) { + // 延时更新时间到了,删除缓存数据 并实际写入数据库 + S($guid,NULL); + S($guid.'_time',NULL); + return $value+$step; + }else{ + // 追加数据到缓存 + S($guid,$value+$step); + return false; + } + }else{ // 没有缓存数据 + S($guid,$step); + // 计时开始 + S($guid.'_time',NOW_TIME); + return false; + } + } + + /** + * 获取一条记录的某个字段值 + * @access public + * @param string $field 字段名 + * @param string $spea 字段数据间隔符号 NULL返回数组 + * @return mixed + */ + public function getField($field,$sepa=null) { + $options['field'] = $field; + $options = $this->_parseOptions($options); + // 判断查询缓存 + if(isset($options['cache'])){ + $cache = $options['cache']; + $key = is_string($cache['key'])?$cache['key']:md5($sepa.serialize($options)); + $data = S($key,'',$cache); + if(false !== $data){ + return $data; + } + } + $field = trim($field); + if(strpos($field,',') && false !== $sepa) { // 多字段 + if(!isset($options['limit'])){ + $options['limit'] = is_numeric($sepa)?$sepa:''; + } + $resultSet = $this->db->select($options); + if(!empty($resultSet)) { + if(is_string($resultSet)){ + return $resultSet; + } + $_field = explode(',', $field); + $field = array_keys($resultSet[0]); + $key1 = array_shift($field); + $key2 = array_shift($field); + $cols = array(); + $count = count($_field); + foreach ($resultSet as $result){ + $name = $result[$key1]; + if(2==$count) { + $cols[$name] = $result[$key2]; + }else{ + $cols[$name] = is_string($sepa)?implode($sepa,array_slice($result,1)):$result; + } + } + if(isset($cache)){ + S($key,$cols,$cache); + } + return $cols; + } + }else{ // 查找一条记录 + // 返回数据个数 + if(true !== $sepa) {// 当sepa指定为true的时候 返回所有数据 + $options['limit'] = is_numeric($sepa)?$sepa:1; + } + $result = $this->db->select($options); + if(!empty($result)) { + if(is_string($result)){ + return $result; + } + if(true !== $sepa && 1==$options['limit']) { + $data = reset($result[0]); + if(isset($cache)){ + S($key,$data,$cache); + } + return $data; + } + foreach ($result as $val){ + $array[] = $val[$field]; + } + if(isset($cache)){ + S($key,$array,$cache); + } + return $array; + } + } + return null; + } + + /** + * 创建数据对象 但不保存到数据库 + * @access public + * @param mixed $data 创建数据 + * @param string $type 状态 + * @return mixed + */ + public function create($data='',$type='') { + // 如果没有传值默认取POST数据 + if(empty($data)) { + $data = I('post.'); + }elseif(is_object($data)){ + $data = get_object_vars($data); + } + // 验证数据 + if(empty($data) || !is_array($data)) { + $this->error = L('_DATA_TYPE_INVALID_'); + return false; + } + + // 状态 + $type = $type?:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT); + + // 检查字段映射 + $data = $this->parseFieldsMap($data,0); + + // 检测提交字段的合法性 + if(isset($this->options['field'])) { // $this->field('field1,field2...')->create() + $fields = $this->options['field']; + unset($this->options['field']); + }elseif($type == self::MODEL_INSERT && isset($this->insertFields)) { + $fields = $this->insertFields; + }elseif($type == self::MODEL_UPDATE && isset($this->updateFields)) { + $fields = $this->updateFields; + } + if(isset($fields)) { + if(is_string($fields)) { + $fields = explode(',',$fields); + } + // 判断令牌验证字段 + if(C('TOKEN_ON')) $fields[] = C('TOKEN_NAME', null, '__hash__'); + foreach ($data as $key=>$val){ + if(!in_array($key,$fields)) { + unset($data[$key]); + } + } + } + + // 数据自动验证 + if(!$this->autoValidation($data,$type)) return false; + + // 表单令牌验证 + if(!$this->autoCheckToken($data)) { + $this->error = L('_TOKEN_ERROR_'); + return false; + } + + // 验证完成生成数据对象 + if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据 + $fields = $this->getDbFields(); + foreach ($data as $key=>$val){ + if(!in_array($key,$fields)) { + unset($data[$key]); + }elseif(MAGIC_QUOTES_GPC && is_string($val)){ + $data[$key] = stripslashes($val); + } + } + } + + // 创建完成对数据进行自动处理 + $this->autoOperation($data,$type); + // 赋值当前数据对象 + $this->data = $data; + // 返回创建的数据以供其他调用 + return $data; + } + + // 自动表单令牌验证 + // TODO ajax无刷新多次提交暂不能满足 + public function autoCheckToken($data) { + // 支持使用token(false) 关闭令牌验证 + if(isset($this->options['token']) && !$this->options['token']) return true; + if(C('TOKEN_ON')){ + $name = C('TOKEN_NAME', null, '__hash__'); + if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效 + return false; + } + + // 令牌验证 + list($key,$value) = explode('_',$data[$name]); + if(isset($_SESSION[$name][$key]) && $value && $_SESSION[$name][$key] === $value) { // 防止重复提交 + unset($_SESSION[$name][$key]); // 验证完成销毁session + return true; + } + // 开启TOKEN重置 + if(C('TOKEN_RESET')) unset($_SESSION[$name][$key]); + return false; + } + return true; + } + + /** + * 使用正则验证数据 + * @access public + * @param string $value 要验证的数据 + * @param string $rule 验证规则 + * @return boolean + */ + public function regex($value,$rule) { + $validate = array( + 'require' => '/\S+/', + 'email' => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', + 'url' => '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(:\d+)?(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/', + 'currency' => '/^\d+(\.\d+)?$/', + 'number' => '/^\d+$/', + 'zip' => '/^\d{6}$/', + 'integer' => '/^[-\+]?\d+$/', + 'double' => '/^[-\+]?\d+(\.\d+)?$/', + 'english' => '/^[A-Za-z]+$/', + ); + // 检查是否有内置的正则表达式 + if(isset($validate[strtolower($rule)])) + $rule = $validate[strtolower($rule)]; + return preg_match($rule,$value)===1; + } + + /** + * 自动表单处理 + * @access public + * @param array $data 创建数据 + * @param string $type 创建类型 + * @return mixed + */ + private function autoOperation(&$data,$type) { + if(false === $this->options['auto']){ + // 关闭自动完成 + return $data; + } + if(!empty($this->options['auto'])) { + $_auto = $this->options['auto']; + unset($this->options['auto']); + }elseif(!empty($this->_auto)){ + $_auto = $this->_auto; + } + // 自动填充 + if(isset($_auto)) { + foreach ($_auto as $auto){ + // 填充因子定义格式 + // array('field','填充内容','填充条件','附加规则',[额外参数]) + if(empty($auto[2])) $auto[2] = self::MODEL_INSERT; // 默认为新增的时候自动填充 + if( $type == $auto[2] || $auto[2] == self::MODEL_BOTH) { + if(empty($auto[3])) $auto[3] = 'string'; + switch(trim($auto[3])) { + case 'function': // 使用函数进行填充 字段的值作为参数 + case 'callback': // 使用回调方法 + $args = isset($auto[4])?(array)$auto[4]:array(); + if(isset($data[$auto[0]])) { + array_unshift($args,$data[$auto[0]]); + } + if('function'==$auto[3]) { + $data[$auto[0]] = call_user_func_array($auto[1], $args); + }else{ + $data[$auto[0]] = call_user_func_array(array(&$this,$auto[1]), $args); + } + break; + case 'field': // 用其它字段的值进行填充 + $data[$auto[0]] = $data[$auto[1]]; + break; + case 'ignore': // 为空忽略 + if($auto[1]===$data[$auto[0]]) + unset($data[$auto[0]]); + break; + case 'string': + default: // 默认作为字符串填充 + $data[$auto[0]] = $auto[1]; + } + if(isset($data[$auto[0]]) && false === $data[$auto[0]] ) unset($data[$auto[0]]); + } + } + } + return $data; + } + + /** + * 自动表单验证 + * @access protected + * @param array $data 创建数据 + * @param string $type 创建类型 + * @return boolean + */ + protected function autoValidation($data,$type) { + if(false === $this->options['validate'] ){ + // 关闭自动验证 + return true; + } + if(!empty($this->options['validate'])) { + $_validate = $this->options['validate']; + unset($this->options['validate']); + }elseif(!empty($this->_validate)){ + $_validate = $this->_validate; + } + // 属性验证 + if(isset($_validate)) { // 如果设置了数据自动验证则进行数据验证 + if($this->patchValidate) { // 重置验证错误信息 + $this->error = array(); + } + foreach($_validate as $key=>$val) { + // 验证因子定义格式 + // array(field,rule,message,condition,type,when,params) + // 判断是否需要执行验证 + if(empty($val[5]) || ( $val[5]== self::MODEL_BOTH && $type < 3 ) || $val[5]== $type ) { + if(0==strpos($val[2],'{%') && strpos($val[2],'}')) + // 支持提示信息的多语言 使用 {%语言定义} 方式 + $val[2] = L(substr($val[2],2,-1)); + $val[3] = isset($val[3])?$val[3]:self::EXISTS_VALIDATE; + $val[4] = isset($val[4])?$val[4]:'regex'; + // 判断验证条件 + switch($val[3]) { + case self::MUST_VALIDATE: // 必须验证 不管表单是否有设置该字段 + if(false === $this->_validationField($data,$val)) + return false; + break; + case self::VALUE_VALIDATE: // 值不为空的时候才验证 + if('' != trim($data[$val[0]])) + if(false === $this->_validationField($data,$val)) + return false; + break; + default: // 默认表单存在该字段就验证 + if(isset($data[$val[0]])) + if(false === $this->_validationField($data,$val)) + return false; + } + } + } + // 批量验证的时候最后返回错误 + if(!empty($this->error)) return false; + } + return true; + } + + /** + * 验证表单字段 支持批量验证 + * 如果批量验证返回错误的数组信息 + * @access protected + * @param array $data 创建数据 + * @param array $val 验证因子 + * @return boolean + */ + protected function _validationField($data,$val) { + if($this->patchValidate && isset($this->error[$val[0]])) + return ; //当前字段已经有规则验证没有通过 + if(false === $this->_validationFieldItem($data,$val)){ + if($this->patchValidate) { + $this->error[$val[0]] = $val[2]; + }else{ + $this->error = $val[2]; + return false; + } + } + return ; + } + + /** + * 根据验证因子验证字段 + * @access protected + * @param array $data 创建数据 + * @param array $val 验证因子 + * @return boolean + */ + protected function _validationFieldItem($data,$val) { + switch(strtolower(trim($val[4]))) { + case 'function':// 使用函数进行验证 + case 'callback':// 调用方法进行验证 + $args = isset($val[6])?(array)$val[6]:array(); + if(is_string($val[0]) && strpos($val[0], ',')) + $val[0] = explode(',', $val[0]); + if(is_array($val[0])){ + // 支持多个字段验证 + foreach($val[0] as $field) + $_data[$field] = $data[$field]; + array_unshift($args, $_data); + }else{ + array_unshift($args, $data[$val[0]]); + } + if('function'==$val[4]) { + return call_user_func_array($val[1], $args); + }else{ + return call_user_func_array(array(&$this, $val[1]), $args); + } + case 'confirm': // 验证两个字段是否相同 + return $data[$val[0]] == $data[$val[1]]; + case 'unique': // 验证某个值是否唯一 + if(is_string($val[0]) && strpos($val[0],',')) + $val[0] = explode(',',$val[0]); + $map = array(); + if(is_array($val[0])) { + // 支持多个字段验证 + foreach ($val[0] as $field) + $map[$field] = $data[$field]; + }else{ + $map[$val[0]] = $data[$val[0]]; + } + $pk = $this->getPk(); + if(!empty($data[$pk]) && is_string($pk)) { // 完善编辑的时候验证唯一 + $map[$pk] = array('neq',$data[$pk]); + } + if($this->where($map)->find()) return false; + return true; + default: // 检查附加规则 + return $this->check($data[$val[0]],$val[1],$val[4]); + } + } + + /** + * 验证数据 支持 in between equal length regex expire ip_allow ip_deny + * @access public + * @param string $value 验证数据 + * @param mixed $rule 验证表达式 + * @param string $type 验证方式 默认为正则验证 + * @return boolean + */ + public function check($value,$rule,$type='regex'){ + $type = strtolower(trim($type)); + switch($type) { + case 'in': // 验证是否在某个指定范围之内 逗号分隔字符串或者数组 + case 'notin': + $range = is_array($rule)? $rule : explode(',',$rule); + return $type == 'in' ? in_array($value ,$range) : !in_array($value ,$range); + case 'between': // 验证是否在某个范围 + case 'notbetween': // 验证是否不在某个范围 + if (is_array($rule)){ + $min = $rule[0]; + $max = $rule[1]; + }else{ + list($min,$max) = explode(',',$rule); + } + return $type == 'between' ? $value>=$min && $value<=$max : $value<$min || $value>$max; + case 'equal': // 验证是否等于某个值 + case 'notequal': // 验证是否等于某个值 + return $type == 'equal' ? $value == $rule : $value != $rule; + case 'length': // 验证长度 + $length = mb_strlen($value,'utf-8'); // 当前数据长度 + if(strpos($rule,',')) { // 长度区间 + list($min,$max) = explode(',',$rule); + return $length >= $min && $length <= $max; + }else{// 指定长度 + return $length == $rule; + } + case 'expire': + list($start,$end) = explode(',',$rule); + if(!is_numeric($start)) $start = strtotime($start); + if(!is_numeric($end)) $end = strtotime($end); + return NOW_TIME >= $start && NOW_TIME <= $end; + case 'ip_allow': // IP 操作许可验证 + return in_array(get_client_ip(),explode(',',$rule)); + case 'ip_deny': // IP 操作禁止验证 + return !in_array(get_client_ip(),explode(',',$rule)); + case 'regex': + default: // 默认使用正则验证 可以使用验证类中定义的验证名称 + // 检查附加规则 + return $this->regex($value,$rule); + } + } + + /** + * 存储过程返回多数据集 + * @access public + * @param string $sql SQL指令 + * @param mixed $parse 是否需要解析SQL + * @return array + */ + public function procedure($sql, $parse = false) { + return $this->db->procedure($sql, $parse); + } + + /** + * SQL查询 + * @access public + * @param string $sql SQL指令 + * @param mixed $parse 是否需要解析SQL + * @return mixed + */ + public function query($sql,$parse=false) { + if(!is_bool($parse) && !is_array($parse)) { + $parse = func_get_args(); + array_shift($parse); + } + $sql = $this->parseSql($sql,$parse); + return $this->db->query($sql); + } + + /** + * 执行SQL语句 + * @access public + * @param string $sql SQL指令 + * @param mixed $parse 是否需要解析SQL + * @return false | integer + */ + public function execute($sql,$parse=false) { + if(!is_bool($parse) && !is_array($parse)) { + $parse = func_get_args(); + array_shift($parse); + } + $sql = $this->parseSql($sql,$parse); + return $this->db->execute($sql); + } + + /** + * 解析SQL语句 + * @access public + * @param string $sql SQL指令 + * @param boolean $parse 是否需要解析SQL + * @return string + */ + protected function parseSql($sql,$parse) { + // 分析表达式 + if(true === $parse) { + $options = $this->_parseOptions(); + $sql = $this->db->parseSql($sql,$options); + }elseif(is_array($parse)){ // SQL预处理 + $parse = array_map(array($this->db,'escapeString'),$parse); + $sql = vsprintf($sql,$parse); + }else{ + $sql = strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>$this->tablePrefix)); + $prefix = $this->tablePrefix; + $sql = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function($match) use($prefix){ return $prefix.strtolower($match[1]);}, $sql); + } + $this->db->setModel($this->name); + return $sql; + } + + /** + * 切换当前的数据库连接 + * @access public + * @param integer $linkNum 连接序号 + * @param mixed $config 数据库连接信息 + * @param boolean $force 强制重新连接 + * @return Model + */ + public function db($linkNum='',$config='',$force=false) { + if('' === $linkNum && $this->db) { + return $this->db; + } + + if(!isset($this->_db[$linkNum]) || $force ) { + // 创建一个新的实例 + if(!empty($config) && is_string($config) && false === strpos($config,'/')) { // 支持读取配置参数 + $config = C($config); + } + $this->_db[$linkNum] = Db::getInstance($config); + }elseif(NULL === $config){ + $this->_db[$linkNum]->close(); // 关闭数据库连接 + unset($this->_db[$linkNum]); + return ; + } + + // 切换数据库连接 + $this->db = $this->_db[$linkNum]; + $this->_after_db(); + // 字段检测 + if(!empty($this->name) && $this->autoCheckFields) $this->_checkTableInfo(); + return $this; + } + // 数据库切换后回调方法 + protected function _after_db() {} + + /** + * 得到当前的数据对象名称 + * @access public + * @return string + */ + public function getModelName() { + if(empty($this->name)){ + $name = substr(get_class($this),0,-strlen(C('DEFAULT_M_LAYER'))); + if ( $pos = strrpos($name,'\\') ) {//有命名空间 + $this->name = substr($name,$pos+1); + }else{ + $this->name = $name; + } + } + return $this->name; + } + + /** + * 得到完整的数据表名 + * @access public + * @return string + */ + public function getTableName() { + if(empty($this->trueTableName)) { + $tableName = !empty($this->tablePrefix) ? $this->tablePrefix : ''; + if(!empty($this->tableName)) { + $tableName .= $this->tableName; + }else{ + $tableName .= parse_name($this->name); + } + $this->trueTableName = strtolower($tableName); + } + return (!empty($this->dbName)?$this->dbName.'.':'').$this->trueTableName; + } + + /** + * 启动事务 + * @access public + * @return void + */ + public function startTrans() { + $this->commit(); + $this->db->startTrans(); + return ; + } + + /** + * 提交事务 + * @access public + * @return boolean + */ + public function commit() { + return $this->db->commit(); + } + + /** + * 事务回滚 + * @access public + * @return boolean + */ + public function rollback() { + return $this->db->rollback(); + } + + /** + * 返回模型的错误信息 + * @access public + * @return string + */ + public function getError(){ + return $this->error; + } + + /** + * 返回数据库的错误信息 + * @access public + * @return string + */ + public function getDbError() { + return $this->db->getError(); + } + + /** + * 返回最后插入的ID + * @access public + * @return string + */ + public function getLastInsID() { + return $this->db->getLastInsID(); + } + + /** + * 返回最后执行的sql语句 + * @access public + * @return string + */ + public function getLastSql() { + return $this->db->getLastSql($this->name); + } + // 鉴于getLastSql比较常用 增加_sql 别名 + public function _sql(){ + return $this->getLastSql(); + } + + /** + * 获取主键名称 + * @access public + * @return string + */ + public function getPk() { + return $this->pk; + } + + /** + * 获取数据表字段信息 + * @access public + * @return array + */ + public function getDbFields(){ + if(isset($this->options['table'])) {// 动态指定表名 + if(is_array($this->options['table'])){ + $table = key($this->options['table']); + }else{ + $table = $this->options['table']; + if(strpos($table,')')){ + // 子查询 + return false; + } + } + $fields = $this->db->getFields($table); + return $fields ? array_keys($fields) : false; + } + if($this->fields) { + $fields = $this->fields; + unset($fields['_type'],$fields['_pk']); + return $fields; + } + return false; + } + + /** + * 设置数据对象值 + * @access public + * @param mixed $data 数据 + * @return Model + */ + public function data($data=''){ + if('' === $data && !empty($this->data)) { + return $this->data; + } + if(is_object($data)){ + $data = get_object_vars($data); + }elseif(is_string($data)){ + parse_str($data,$data); + }elseif(!is_array($data)){ + E(L('_DATA_TYPE_INVALID_')); + } + $this->data = $data; + return $this; + } + + /** + * 指定当前的数据表 + * @access public + * @param mixed $table + * @return Model + */ + public function table($table) { + $prefix = $this->tablePrefix; + if(is_array($table)) { + $this->options['table'] = $table; + }elseif(!empty($table)) { + //将__TABLE_NAME__替换成带前缀的表名 + $table = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function($match) use($prefix){ return $prefix.strtolower($match[1]);}, $table); + $this->options['table'] = $table; + } + return $this; + } + + /** + * USING支持 用于多表删除 + * @access public + * @param mixed $using + * @return Model + */ + public function using($using){ + $prefix = $this->tablePrefix; + if(is_array($using)) { + $this->options['using'] = $using; + }elseif(!empty($using)) { + //将__TABLE_NAME__替换成带前缀的表名 + $using = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function($match) use($prefix){ return $prefix.strtolower($match[1]);}, $using); + $this->options['using'] = $using; + } + return $this; + } + + /** + * 查询SQL组装 join + * @access public + * @param mixed $join + * @param string $type JOIN类型 + * @return Model + */ + public function join($join,$type='INNER') { + $prefix = $this->tablePrefix; + if(is_array($join)) { + foreach ($join as $key=>&$_join){ + $_join = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function($match) use($prefix){ return $prefix.strtolower($match[1]);}, $_join); + $_join = false !== stripos($_join,'JOIN')? $_join : $type.' JOIN ' .$_join; + } + $this->options['join'] = $join; + }elseif(!empty($join)) { + //将__TABLE_NAME__字符串替换成带前缀的表名 + $join = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function($match) use($prefix){ return $prefix.strtolower($match[1]);}, $join); + $this->options['join'][] = false !== stripos($join,'JOIN')? $join : $type.' JOIN '.$join; + } + return $this; + } + + /** + * 查询SQL组装 union + * @access public + * @param mixed $union + * @param boolean $all + * @return Model + */ + public function union($union,$all=false) { + if(empty($union)) return $this; + if($all) { + $this->options['union']['_all'] = true; + } + if(is_object($union)) { + $union = get_object_vars($union); + } + // 转换union表达式 + if(is_string($union) ) { + $prefix = $this->tablePrefix; + //将__TABLE_NAME__字符串替换成带前缀的表名 + $options = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function($match) use($prefix){ return $prefix.strtolower($match[1]);}, $union); + }elseif(is_array($union)){ + if(isset($union[0])) { + $this->options['union'] = array_merge($this->options['union'],$union); + return $this; + }else{ + $options = $union; + } + }else{ + E(L('_DATA_TYPE_INVALID_')); + } + $this->options['union'][] = $options; + return $this; + } + + /** + * 查询缓存 + * @access public + * @param mixed $key + * @param integer $expire + * @param string $type + * @return Model + */ + public function cache($key=true,$expire=null,$type=''){ + // 增加快捷调用方式 cache(10) 等同于 cache(true, 10) + if(is_numeric($key) && is_null($expire)){ + $expire = $key; + $key = true; + } + if(false !== $key) + $this->options['cache'] = array('key'=>$key,'expire'=>$expire,'type'=>$type); + return $this; + } + + /** + * 指定查询字段 支持字段排除 + * @access public + * @param mixed $field + * @param boolean $except 是否排除 + * @return Model + */ + public function field($field,$except=false){ + if(true === $field) {// 获取全部字段 + $fields = $this->getDbFields(); + $field = $fields?:'*'; + }elseif($except) {// 字段排除 + if(is_string($field)) { + $field = explode(',',$field); + } + $fields = $this->getDbFields(); + $field = $fields?array_diff($fields,$field):$field; + } + $this->options['field'] = $field; + return $this; + } + + /** + * 调用命名范围 + * @access public + * @param mixed $scope 命名范围名称 支持多个 和直接定义 + * @param array $args 参数 + * @return Model + */ + public function scope($scope='',$args=NULL){ + if('' === $scope) { + if(isset($this->_scope['default'])) { + // 默认的命名范围 + $options = $this->_scope['default']; + }else{ + return $this; + } + }elseif(is_string($scope)){ // 支持多个命名范围调用 用逗号分割 + $scopes = explode(',',$scope); + $options = array(); + foreach ($scopes as $name){ + if(!isset($this->_scope[$name])) continue; + $options = array_merge($options,$this->_scope[$name]); + } + if(!empty($args) && is_array($args)) { + $options = array_merge($options,$args); + } + }elseif(is_array($scope)){ // 直接传入命名范围定义 + $options = $scope; + } + + if(is_array($options) && !empty($options)){ + $this->options = array_merge($this->options,array_change_key_case($options)); + } + return $this; + } + + /** + * 指定查询条件 支持安全过滤 + * @access public + * @param mixed $where 条件表达式 + * @param mixed $parse 预处理参数 + * @return Model + */ + public function where($where,$parse=null){ + if(!is_null($parse) && is_string($where)) { + if(!is_array($parse)) { + $parse = func_get_args(); + array_shift($parse); + } + $parse = array_map(array($this->db,'escapeString'),$parse); + $where = vsprintf($where,$parse); + }elseif(is_object($where)){ + $where = get_object_vars($where); + } + if(is_string($where) && '' != $where){ + $map = array(); + $map['_string'] = $where; + $where = $map; + } + if(isset($this->options['where'])){ + $this->options['where'] = array_merge($this->options['where'],$where); + }else{ + $this->options['where'] = $where; + } + + return $this; + } + + /** + * 指定查询数量 + * @access public + * @param mixed $offset 起始位置 + * @param mixed $length 查询数量 + * @return Model + */ + public function limit($offset,$length=null){ + if(is_null($length) && strpos($offset,',')){ + list($offset,$length) = explode(',',$offset); + } + $this->options['limit'] = intval($offset).( $length? ','.intval($length) : '' ); + return $this; + } + + /** + * 指定分页 + * @access public + * @param mixed $page 页数 + * @param mixed $listRows 每页数量 + * @return Model + */ + public function page($page,$listRows=null){ + if(is_null($listRows) && strpos($page,',')){ + list($page,$listRows) = explode(',',$page); + } + $this->options['page'] = array(intval($page),intval($listRows)); + return $this; + } + + /** + * 查询注释 + * @access public + * @param string $comment 注释 + * @return Model + */ + public function comment($comment){ + $this->options['comment'] = $comment; + return $this; + } + + /** + * 获取执行的SQL语句 + * @access public + * @param boolean $fetch 是否返回sql + * @return Model + */ + public function fetchSql($fetch=true){ + $this->options['fetch_sql'] = $fetch; + return $this; + } + + /** + * 参数绑定 + * @access public + * @param string $key 参数名 + * @param mixed $value 绑定的变量及绑定参数 + * @return Model + */ + public function bind($key,$value=false) { + if(is_array($key)){ + $this->options['bind'] = $key; + }else{ + $num = func_num_args(); + if($num>2){ + $params = func_get_args(); + array_shift($params); + $this->options['bind'][$key] = $params; + }else{ + $this->options['bind'][$key] = $value; + } + } + return $this; + } + + /** + * 设置模型的属性值 + * @access public + * @param string $name 名称 + * @param mixed $value 值 + * @return Model + */ + public function setProperty($name,$value) { + if(property_exists($this,$name)) + $this->$name = $value; + return $this; + } + +} diff --git a/ThinkPHP/Library/Think/Route.class.php b/ThinkPHP/Library/Think/Route.class.php new file mode 100644 index 0000000..c1bf8a5 --- /dev/null +++ b/ThinkPHP/Library/Think/Route.class.php @@ -0,0 +1,316 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP路由解析类 + */ +class Route { + + // 路由检测 + public static function check(){ + $depr = C('URL_PATHINFO_DEPR'); + $regx = preg_replace('/\.'.__EXT__.'$/i','',trim($_SERVER['PATH_INFO'],$depr)); + // 分隔符替换 确保路由定义使用统一的分隔符 + if('/' != $depr){ + $regx = str_replace($depr,'/',$regx); + } + // URL映射定义(静态路由) + $maps = C('URL_MAP_RULES'); + if(isset($maps[$regx])) { + $var = self::parseUrl($maps[$regx]); + $_GET = array_merge($var, $_GET); + return true; + } + // 动态路由处理 + $routes = C('URL_ROUTE_RULES'); + if(!empty($routes)) { + foreach ($routes as $rule=>$route){ + if(is_numeric($rule)){ + // 支持 array('rule','adddress',...) 定义路由 + $rule = array_shift($route); + } + if(is_array($route) && isset($route[2])){ + // 路由参数 + $options = $route[2]; + if(isset($options['ext']) && __EXT__ != $options['ext']){ + // URL后缀检测 + continue; + } + if(isset($options['method']) && REQUEST_METHOD != strtoupper($options['method'])){ + // 请求类型检测 + continue; + } + // 自定义检测 + if(!empty($options['callback']) && is_callable($options['callback'])) { + if(false === call_user_func($options['callback'])) { + continue; + } + } + } + if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { // 正则路由 + if($route instanceof \Closure) { + // 执行闭包 + $result = self::invokeRegx($route, $matches); + // 如果返回布尔值 则继续执行 + return is_bool($result) ? $result : exit; + }else{ + return self::parseRegex($matches,$route,$regx); + } + }else{ // 规则路由 + $len1 = substr_count($regx,'/'); + $len2 = substr_count($rule,'/'); + if($len1>=$len2 || strpos($rule,'[')) { + if('$' == substr($rule,-1,1)) {// 完整匹配 + if($len1 != $len2) { + continue; + }else{ + $rule = substr($rule,0,-1); + } + } + $match = self::checkUrlMatch($regx,$rule); + if(false !== $match) { + if($route instanceof \Closure) { + // 执行闭包 + $result = self::invokeRule($route, $match); + // 如果返回布尔值 则继续执行 + return is_bool($result) ? $result : exit; + }else{ + return self::parseRule($rule,$route,$regx); + } + } + } + } + } + } + return false; + } + + // 检测URL和规则路由是否匹配 + private static function checkUrlMatch($regx,$rule) { + $m1 = explode('/',$regx); + $m2 = explode('/',$rule); + $var = array(); + foreach ($m2 as $key=>$val){ + if(0 === strpos($val,'[:')){ + $val = substr($val,1,-1); + } + + if(':' == substr($val,0,1)) {// 动态变量 + if($pos = strpos($val,'|')){ + // 使用函数过滤 + $val = substr($val,1,$pos-1); + } + if(strpos($val,'\\')) { + $type = substr($val,-1); + if('d'==$type) { + if(isset($m1[$key]) && !is_numeric($m1[$key])) + return false; + } + $name = substr($val, 1, -2); + }elseif($pos = strpos($val,'^')){ + $array = explode('-',substr(strstr($val,'^'),1)); + if(in_array($m1[$key],$array)) { + return false; + } + $name = substr($val, 1, $pos - 1); + }else{ + $name = substr($val, 1); + } + $var[$name] = isset($m1[$key])?$m1[$key]:''; + }elseif(0 !== strcasecmp($val,$m1[$key])){ + return false; + } + } + // 成功匹配后返回URL中的动态变量数组 + return $var; + } + + // 解析规范的路由地址 + // 地址格式 [控制器/操作?]参数1=值1&参数2=值2... + private static function parseUrl($url) { + $var = array(); + if(false !== strpos($url,'?')) { // [控制器/操作?]参数1=值1&参数2=值2... + $info = parse_url($url); + $path = explode('/',$info['path']); + parse_str($info['query'],$var); + }elseif(strpos($url,'/')){ // [控制器/操作] + $path = explode('/',$url); + }else{ // 参数1=值1&参数2=值2... + parse_str($url,$var); + } + if(isset($path)) { + $var[C('VAR_ACTION')] = array_pop($path); + if(!empty($path)) { + $var[C('VAR_CONTROLLER')] = array_pop($path); + } + if(!empty($path)) { + $var[C('VAR_MODULE')] = array_pop($path); + } + } + return $var; + } + + // 解析规则路由 + // '路由规则'=>'[控制器/操作]?额外参数1=值1&额外参数2=值2...' + // '路由规则'=>array('[控制器/操作]','额外参数1=值1&额外参数2=值2...') + // '路由规则'=>'外部地址' + // '路由规则'=>array('外部地址','重定向代码') + // 路由规则中 :开头 表示动态变量 + // 外部地址中可以用动态变量 采用 :1 :2 的方式 + // 'news/:month/:day/:id'=>array('News/read?cate=1','status=1'), + // 'new/:id'=>array('/new.php?id=:1',301), 重定向 + private static function parseRule($rule,$route,$regx) { + // 获取路由地址规则 + $url = is_array($route)?$route[0]:$route; + // 获取URL地址中的参数 + $paths = explode('/',$regx); + // 解析路由规则 + $matches = array(); + $rule = explode('/',$rule); + foreach ($rule as $item){ + $fun = ''; + if(0 === strpos($item,'[:')){ + $item = substr($item,1,-1); + } + if(0===strpos($item,':')) { // 动态变量获取 + if($pos = strpos($item,'|')){ + // 支持函数过滤 + $fun = substr($item,$pos+1); + $item = substr($item,0,$pos); + } + if($pos = strpos($item,'^') ) { + $var = substr($item,1,$pos-1); + }elseif(strpos($item,'\\')){ + $var = substr($item,1,-2); + }else{ + $var = substr($item,1); + } + $matches[$var] = !empty($fun)? $fun(array_shift($paths)) : array_shift($paths); + }else{ // 过滤URL中的静态变量 + array_shift($paths); + } + } + + if(0=== strpos($url,'/') || 0===strpos($url,'http')) { // 路由重定向跳转 + if(strpos($url,':')) { // 传递动态参数 + $values = array_values($matches); + $url = preg_replace_callback('/:(\d+)/', function($match) use($values){ return $values[$match[1] - 1]; }, $url); + } + header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301); + exit; + }else{ + // 解析路由地址 + $var = self::parseUrl($url); + // 解析路由地址里面的动态参数 + $values = array_values($matches); + foreach ($var as $key=>$val){ + if(0===strpos($val,':')) { + $var[$key] = $values[substr($val,1)-1]; + } + } + $var = array_merge($matches,$var); + // 解析剩余的URL参数 + if(!empty($paths)) { + preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){ $var[strtolower($match[1])]=strip_tags($match[2]);}, implode('/',$paths)); + } + // 解析路由自动传入参数 + if(is_array($route) && isset($route[1])) { + if(is_array($route[1])){ + $params = $route[1]; + }else{ + parse_str($route[1],$params); + } + $var = array_merge($var,$params); + } + $_GET = array_merge($var,$_GET); + } + return true; + } + + // 解析正则路由 + // '路由正则'=>'[控制器/操作]?参数1=值1&参数2=值2...' + // '路由正则'=>array('[控制器/操作]?参数1=值1&参数2=值2...','额外参数1=值1&额外参数2=值2...') + // '路由正则'=>'外部地址' + // '路由正则'=>array('外部地址','重定向代码') + // 参数值和外部地址中可以用动态变量 采用 :1 :2 的方式 + // '/new\/(\d+)\/(\d+)/'=>array('News/read?id=:1&page=:2&cate=1','status=1'), + // '/new\/(\d+)/'=>array('/new.php?id=:1&page=:2&status=1','301'), 重定向 + private static function parseRegex($matches,$route,$regx) { + // 获取路由地址规则 + $url = is_array($route)?$route[0]:$route; + $url = preg_replace_callback('/:(\d+)/', function($match) use($matches){return $matches[$match[1]];}, $url); + if(0=== strpos($url,'/') || 0===strpos($url,'http')) { // 路由重定向跳转 + header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301); + exit; + }else{ + // 解析路由地址 + $var = self::parseUrl($url); + // 处理函数 + foreach($var as $key=>$val){ + if(strpos($val,'|')){ + list($val,$fun) = explode('|',$val); + $var[$key] = $fun($val); + } + } + // 解析剩余的URL参数 + $regx = substr_replace($regx,'',0,strlen($matches[0])); + if($regx) { + preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){ + $var[strtolower($match[1])] = strip_tags($match[2]); + }, $regx); + } + // 解析路由自动传入参数 + if(is_array($route) && isset($route[1])) { + if(is_array($route[1])){ + $params = $route[1]; + }else{ + parse_str($route[1],$params); + } + $var = array_merge($var,$params); + } + $_GET = array_merge($var,$_GET); + } + return true; + } + + // 执行正则匹配下的闭包方法 支持参数调用 + static private function invokeRegx($closure, $var = array()) { + $reflect = new \ReflectionFunction($closure); + $params = $reflect->getParameters(); + $args = array(); + array_shift($var); + foreach ($params as $param){ + if(!empty($var)) { + $args[] = array_shift($var); + }elseif($param->isDefaultValueAvailable()){ + $args[] = $param->getDefaultValue(); + } + } + return $reflect->invokeArgs($args); + } + + // 执行规则匹配下的闭包方法 支持参数调用 + static private function invokeRule($closure, $var = array()) { + $reflect = new \ReflectionFunction($closure); + $params = $reflect->getParameters(); + $args = array(); + foreach ($params as $param){ + $name = $param->getName(); + if(isset($var[$name])) { + $args[] = $var[$name]; + }elseif($param->isDefaultValueAvailable()){ + $args[] = $param->getDefaultValue(); + } + } + return $reflect->invokeArgs($args); + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Storage.class.php b/ThinkPHP/Library/Think/Storage.class.php new file mode 100644 index 0000000..653e136 --- /dev/null +++ b/ThinkPHP/Library/Think/Storage.class.php @@ -0,0 +1,40 @@ +<?php +// +---------------------------------------------------------------------- +// | TOPThink [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2013 http://topthink.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +// 分布式文件存储类 +class Storage { + + /** + * 操作句柄 + * @var string + * @access protected + */ + static protected $handler ; + + /** + * 连接分布式文件系统 + * @access public + * @param string $type 文件类型 + * @param array $options 配置数组 + * @return void + */ + static public function connect($type='File',$options=array()) { + $class = 'Think\\Storage\\Driver\\'.ucwords($type); + self::$handler = new $class($options); + } + + static public function __callstatic($method,$args){ + //调用缓存驱动的方法 + if(method_exists(self::$handler, $method)){ + return call_user_func_array(array(self::$handler,$method), $args); + } + } +} diff --git a/ThinkPHP/Library/Think/Storage/Driver/File.class.php b/ThinkPHP/Library/Think/Storage/Driver/File.class.php new file mode 100644 index 0000000..ea9d925 --- /dev/null +++ b/ThinkPHP/Library/Think/Storage/Driver/File.class.php @@ -0,0 +1,123 @@ +<?php +// +---------------------------------------------------------------------- +// | TOPThink [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2013 http://topthink.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Storage\Driver; +use Think\Storage; +// 本地文件写入存储类 +class File extends Storage{ + + private $contents=array(); + + /** + * 架构函数 + * @access public + */ + public function __construct() { + } + + /** + * 文件内容读取 + * @access public + * @param string $filename 文件名 + * @return string + */ + public function read($filename,$type=''){ + return $this->get($filename,'content',$type); + } + + /** + * 文件写入 + * @access public + * @param string $filename 文件名 + * @param string $content 文件内容 + * @return boolean + */ + public function put($filename,$content,$type=''){ + $dir = dirname($filename); + if(!is_dir($dir)){ + mkdir($dir,0777,true); + } + if(false === file_put_contents($filename,$content)){ + E(L('_STORAGE_WRITE_ERROR_').':'.$filename); + }else{ + $this->contents[$filename]=$content; + return true; + } + } + + /** + * 文件追加写入 + * @access public + * @param string $filename 文件名 + * @param string $content 追加的文件内容 + * @return boolean + */ + public function append($filename,$content,$type=''){ + if(is_file($filename)){ + $content = $this->read($filename,$type).$content; + } + return $this->put($filename,$content,$type); + } + + /** + * 加载文件 + * @access public + * @param string $filename 文件名 + * @param array $vars 传入变量 + * @return void + */ + public function load($_filename,$vars=null){ + if(!is_null($vars)){ + extract($vars, EXTR_OVERWRITE); + } + include $_filename; + } + + /** + * 文件是否存在 + * @access public + * @param string $filename 文件名 + * @return boolean + */ + public function has($filename,$type=''){ + return is_file($filename); + } + + /** + * 文件删除 + * @access public + * @param string $filename 文件名 + * @return boolean + */ + public function unlink($filename,$type=''){ + unset($this->contents[$filename]); + return is_file($filename) ? unlink($filename) : false; + } + + /** + * 读取文件信息 + * @access public + * @param string $filename 文件名 + * @param string $name 信息名 mtime或者content + * @return boolean + */ + public function get($filename,$name,$type=''){ + if(!isset($this->contents[$filename])){ + if(!is_file($filename)) return false; + $this->contents[$filename]=file_get_contents($filename); + } + $content=$this->contents[$filename]; + $info = array( + 'mtime' => filemtime($filename), + 'content' => $content + ); + return $info[$name]; + } +} diff --git a/ThinkPHP/Library/Think/Storage/Driver/Sae.class.php b/ThinkPHP/Library/Think/Storage/Driver/Sae.class.php new file mode 100644 index 0000000..3756115 --- /dev/null +++ b/ThinkPHP/Library/Think/Storage/Driver/Sae.class.php @@ -0,0 +1,193 @@ +<?php +// +---------------------------------------------------------------------- +// | TOPThink [ WE CAN DO IT JUST THINK ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2013 http://topthink.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: luofei614 <weibo.com/luofei614> +// +---------------------------------------------------------------------- +namespace Think\Storage\Driver; +use Think\Storage; +// SAE环境文件写入存储类 +class Sae extends Storage{ + + /** + * 架构函数 + * @access public + */ + private $mc; + private $kvs = array(); + private $htmls = array(); + private $contents = array(); + public function __construct() { + if(!function_exists('memcache_init')){ + header('Content-Type:text/html;charset=utf-8'); + exit('请在SAE平台上运行代码。'); + } + $this->mc = @memcache_init(); + if(!$this->mc){ + header('Content-Type:text/html;charset=utf-8'); + exit('您未开通Memcache服务,请在SAE管理平台初始化Memcache服务'); + } + } + + /** + * 获得SaeKv对象 + */ + private function getKv(){ + static $kv; + if(!$kv){ + $kv = new \SaeKV(); + if(!$kv->init()) + E('您没有初始化KVDB,请在SAE管理平台初始化KVDB服务'); + } + return $kv; + } + + + /** + * 文件内容读取 + * @access public + * @param string $filename 文件名 + * @return string + */ + public function read($filename,$type=''){ + switch(strtolower($type)){ + case 'f': + $kv = $this->getKv(); + if(!isset($this->kvs[$filename])){ + $this->kvs[$filename]=$kv->get($filename); + } + return $this->kvs[$filename]; + default: + return $this->get($filename,'content',$type); + } + } + + /** + * 文件写入 + * @access public + * @param string $filename 文件名 + * @param string $content 文件内容 + * @return boolean + */ + public function put($filename,$content,$type=''){ + switch(strtolower($type)){ + case 'f': + $kv = $this->getKv(); + $this->kvs[$filename] = $content; + return $kv->set($filename,$content); + case 'html': + $kv = $this->getKv(); + $content = time().$content; + $this->htmls[$filename] = $content; + return $kv->set($filename,$content); + default: + $content = time().$content; + if(!$this->mc->set($filename,$content,MEMCACHE_COMPRESSED,0)){ + E(L('_STORAGE_WRITE_ERROR_').':'.$filename); + }else{ + $this->contents[$filename] = $content; + return true; + } + } + } + + /** + * 文件追加写入 + * @access public + * @param string $filename 文件名 + * @param string $content 追加的文件内容 + * @return boolean + */ + public function append($filename,$content,$type=''){ + if($old_content = $this->read($filename,$type)){ + $content = $old_content.$content; + } + return $this->put($filename,$content,$type); + } + + /** + * 加载文件 + * @access public + * @param string $_filename 文件名 + * @param array $vars 传入变量 + * @return void + */ + public function load($_filename,$vars=null){ + if(!is_null($vars)) + extract($vars, EXTR_OVERWRITE); + eval('?>'.$this->read($_filename)); + } + + /** + * 文件是否存在 + * @access public + * @param string $filename 文件名 + * @return boolean + */ + public function has($filename,$type=''){ + if($this->read($filename,$type)){ + return true; + }else{ + return false; + } + } + + /** + * 文件删除 + * @access public + * @param string $filename 文件名 + * @return boolean + */ + public function unlink($filename,$type=''){ + switch(strtolower($type)){ + case 'f': + $kv = $this->getKv(); + unset($this->kvs[$filename]); + return $kv->delete($filename); + case 'html': + $kv = $this->getKv(); + unset($this->htmls[$filename]); + return $kv->delete($filename); + default: + unset($this->contents[$filename]); + return $this->mc->delete($filename); + } + } + + /** + * 读取文件信息 + * @access public + * @param string $filename 文件名 + * @param string $name 信息名 mtime或者content + * @return boolean + */ + public function get($filename,$name,$type=''){ + switch(strtolower($type)){ + case 'html': + if(!isset($this->htmls[$filename])){ + $kv = $this->getKv(); + $this->htmls[$filename] = $kv->get($filename); + } + $content = $this->htmls[$filename]; + break; + default: + if(!isset($this->contents[$filename])){ + $this->contents[$filename] = $this->mc->get($filename); + } + $content = $this->contents[$filename]; + } + if(false===$content){ + return false; + } + $info = array( + 'mtime' => substr($content,0,10), + 'content' => substr($content,10) + ); + return $info[$name]; + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Template.class.php b/ThinkPHP/Library/Think/Template.class.php new file mode 100644 index 0000000..c43a97a --- /dev/null +++ b/ThinkPHP/Library/Think/Template.class.php @@ -0,0 +1,700 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP内置模板引擎类 + * 支持XML标签和普通标签的模板解析 + * 编译型模板引擎 支持动态缓存 + */ +class Template { + + // 模板页面中引入的标签库列表 + protected $tagLib = array(); + // 当前模板文件 + protected $templateFile = ''; + // 模板变量 + public $tVar = array(); + public $config = array(); + private $literal = array(); + private $block = array(); + + /** + * 架构函数 + * @access public + */ + public function __construct(){ + $this->config['cache_path'] = C('CACHE_PATH'); + $this->config['template_suffix'] = C('TMPL_TEMPLATE_SUFFIX'); + $this->config['cache_suffix'] = C('TMPL_CACHFILE_SUFFIX'); + $this->config['tmpl_cache'] = C('TMPL_CACHE_ON'); + $this->config['cache_time'] = C('TMPL_CACHE_TIME'); + $this->config['taglib_begin'] = $this->stripPreg(C('TAGLIB_BEGIN')); + $this->config['taglib_end'] = $this->stripPreg(C('TAGLIB_END')); + $this->config['tmpl_begin'] = $this->stripPreg(C('TMPL_L_DELIM')); + $this->config['tmpl_end'] = $this->stripPreg(C('TMPL_R_DELIM')); + $this->config['default_tmpl'] = C('TEMPLATE_NAME'); + $this->config['layout_item'] = C('TMPL_LAYOUT_ITEM'); + } + + private function stripPreg($str) { + return str_replace( + array('{','}','(',')','|','[',']','-','+','*','.','^','?'), + array('\{','\}','\(','\)','\|','\[','\]','\-','\+','\*','\.','\^','\?'), + $str); + } + + // 模板变量获取和设置 + public function get($name) { + if(isset($this->tVar[$name])) + return $this->tVar[$name]; + else + return false; + } + + public function set($name,$value) { + $this->tVar[$name]= $value; + } + + /** + * 加载模板 + * @access public + * @param string $templateFile 模板文件 + * @param array $templateVar 模板变量 + * @param string $prefix 模板标识前缀 + * @return void + */ + public function fetch($templateFile,$templateVar,$prefix='') { + $this->tVar = $templateVar; + $templateCacheFile = $this->loadTemplate($templateFile,$prefix); + Storage::load($templateCacheFile,$this->tVar,null,'tpl'); + } + + /** + * 加载主模板并缓存 + * @access public + * @param string $templateFile 模板文件 + * @param string $prefix 模板标识前缀 + * @return string + * @throws ThinkExecption + */ + public function loadTemplate ($templateFile,$prefix='') { + if(is_file($templateFile)) { + $this->templateFile = $templateFile; + // 读取模板文件内容 + $tmplContent = file_get_contents($templateFile); + }else{ + $tmplContent = $templateFile; + } + // 根据模版文件名定位缓存文件 + $tmplCacheFile = $this->config['cache_path'].$prefix.md5($templateFile).$this->config['cache_suffix']; + + // 判断是否启用布局 + if(C('LAYOUT_ON')) { + if(false !== strpos($tmplContent,'{__NOLAYOUT__}')) { // 可以单独定义不使用布局 + $tmplContent = str_replace('{__NOLAYOUT__}','',$tmplContent); + }else{ // 替换布局的主体内容 + $layoutFile = THEME_PATH.C('LAYOUT_NAME').$this->config['template_suffix']; + // 检查布局文件 + if(!is_file($layoutFile)) { + E(L('_TEMPLATE_NOT_EXIST_').':'.$layoutFile); + } + $tmplContent = str_replace($this->config['layout_item'],$tmplContent,file_get_contents($layoutFile)); + } + } + // 编译模板内容 + $tmplContent = $this->compiler($tmplContent); + Storage::put($tmplCacheFile,trim($tmplContent),'tpl'); + return $tmplCacheFile; + } + + /** + * 编译模板文件内容 + * @access protected + * @param mixed $tmplContent 模板内容 + * @return string + */ + protected function compiler($tmplContent) { + //模板解析 + $tmplContent = $this->parse($tmplContent); + // 还原被替换的Literal标签 + $tmplContent = preg_replace_callback('/<!--###literal(\d+)###-->/is', array($this, 'restoreLiteral'), $tmplContent); + // 添加安全代码 + $tmplContent = '<?php if (!defined(\'THINK_PATH\')) exit();?>'.$tmplContent; + // 优化生成的php代码 + $tmplContent = str_replace('?><?php','',$tmplContent); + // 模版编译过滤标签 + Hook::listen('template_filter',$tmplContent); + return strip_whitespace($tmplContent); + } + + /** + * 模板解析入口 + * 支持普通标签和TagLib解析 支持自定义标签库 + * @access public + * @param string $content 要解析的模板内容 + * @return string + */ + public function parse($content) { + // 内容为空不解析 + if(empty($content)) return ''; + $begin = $this->config['taglib_begin']; + $end = $this->config['taglib_end']; + // 检查include语法 + $content = $this->parseInclude($content); + // 检查PHP语法 + $content = $this->parsePhp($content); + // 首先替换literal标签内容 + $content = preg_replace_callback('/'.$begin.'literal'.$end.'(.*?)'.$begin.'\/literal'.$end.'/is', array($this, 'parseLiteral'),$content); + + // 获取需要引入的标签库列表 + // 标签库只需要定义一次,允许引入多个一次 + // 一般放在文件的最前面 + // 格式:<taglib name="html,mytag..." /> + // 当TAGLIB_LOAD配置为true时才会进行检测 + if(C('TAGLIB_LOAD')) { + $this->getIncludeTagLib($content); + if(!empty($this->tagLib)) { + // 对导入的TagLib进行解析 + foreach($this->tagLib as $tagLibName) { + $this->parseTagLib($tagLibName,$content); + } + } + } + // 预先加载的标签库 无需在每个模板中使用taglib标签加载 但必须使用标签库XML前缀 + if(C('TAGLIB_PRE_LOAD')) { + $tagLibs = explode(',',C('TAGLIB_PRE_LOAD')); + foreach ($tagLibs as $tag){ + $this->parseTagLib($tag,$content); + } + } + // 内置标签库 无需使用taglib标签导入就可以使用 并且不需使用标签库XML前缀 + $tagLibs = explode(',',C('TAGLIB_BUILD_IN')); + foreach ($tagLibs as $tag){ + $this->parseTagLib($tag,$content,true); + } + //解析普通模板标签 {$tagName} + $content = preg_replace_callback('/('.$this->config['tmpl_begin'].')([^\d\w\s'.$this->config['tmpl_begin'].$this->config['tmpl_end'].'].+?)('.$this->config['tmpl_end'].')/is', array($this, 'parseTag'),$content); + return $content; + } + + // 检查PHP语法 + protected function parsePhp($content) { + if(ini_get('short_open_tag')){ + // 开启短标签的情况要将<?标签用echo方式输出 否则无法正常输出xml标识 + $content = preg_replace('/(<\?(?!php|=|$))/i', '<?php echo \'\\1\'; ?>'."\n", $content ); + } + // PHP语法检查 + if(C('TMPL_DENY_PHP') && false !== strpos($content,'<?php')) { + E(L('_NOT_ALLOW_PHP_')); + } + return $content; + } + + // 解析模板中的布局标签 + protected function parseLayout($content) { + // 读取模板中的布局标签 + $find = preg_match('/'.$this->config['taglib_begin'].'layout\s(.+?)\s*?\/'.$this->config['taglib_end'].'/is',$content,$matches); + if($find) { + //替换Layout标签 + $content = str_replace($matches[0],'',$content); + //解析Layout标签 + $array = $this->parseXmlAttrs($matches[1]); + if(!C('LAYOUT_ON') || C('LAYOUT_NAME') !=$array['name'] ) { + // 读取布局模板 + $layoutFile = THEME_PATH.$array['name'].$this->config['template_suffix']; + $replace = isset($array['replace'])?$array['replace']:$this->config['layout_item']; + // 替换布局的主体内容 + $content = str_replace($replace,$content,file_get_contents($layoutFile)); + } + }else{ + $content = str_replace('{__NOLAYOUT__}','',$content); + } + return $content; + } + + // 解析模板中的include标签 + protected function parseInclude($content, $extend = true) { + // 解析继承 + if($extend) + $content = $this->parseExtend($content); + // 解析布局 + $content = $this->parseLayout($content); + // 读取模板中的include标签 + $find = preg_match_all('/'.$this->config['taglib_begin'].'include\s(.+?)\s*?\/'.$this->config['taglib_end'].'/is',$content,$matches); + if($find) { + for($i=0;$i<$find;$i++) { + $include = $matches[1][$i]; + $array = $this->parseXmlAttrs($include); + $file = $array['file']; + unset($array['file']); + $content = str_replace($matches[0][$i],$this->parseIncludeItem($file,$array,$extend),$content); + } + } + return $content; + } + + // 解析模板中的extend标签 + protected function parseExtend($content) { + $begin = $this->config['taglib_begin']; + $end = $this->config['taglib_end']; + // 读取模板中的继承标签 + $find = preg_match('/'.$begin.'extend\s(.+?)\s*?\/'.$end.'/is',$content,$matches); + if($find) { + //替换extend标签 + $content = str_replace($matches[0],'',$content); + // 记录页面中的block标签 + preg_replace_callback('/'.$begin.'block\sname=[\'"](.+?)[\'"]\s*?'.$end.'(.*?)'.$begin.'\/block'.$end.'/is', array($this, 'parseBlock'),$content); + // 读取继承模板 + $array = $this->parseXmlAttrs($matches[1]); + $content = $this->parseTemplateName($array['name']); + $content = $this->parseInclude($content, false); //对继承模板中的include进行分析 + // 替换block标签 + $content = $this->replaceBlock($content); + }else{ + $content = preg_replace_callback('/'.$begin.'block\sname=[\'"](.+?)[\'"]\s*?'.$end.'(.*?)'.$begin.'\/block'.$end.'/is', function($match){return stripslashes($match[2]);}, $content); + } + return $content; + } + + /** + * 分析XML属性 + * @access private + * @param string $attrs XML属性字符串 + * @return array + */ + private function parseXmlAttrs($attrs) { + $xml = '<tpl><tag '.$attrs.' /></tpl>'; + $xml = simplexml_load_string($xml); + if(!$xml) + E(L('_XML_TAG_ERROR_')); + $xml = (array)($xml->tag->attributes()); + $array = array_change_key_case($xml['@attributes']); + return $array; + } + + /** + * 替换页面中的literal标签 + * @access private + * @param string $content 模板内容 + * @return string|false + */ + private function parseLiteral($content) { + if(is_array($content)) $content = $content[1]; + if(trim($content)=='') return ''; + //$content = stripslashes($content); + $i = count($this->literal); + $parseStr = "<!--###literal{$i}###-->"; + $this->literal[$i] = $content; + return $parseStr; + } + + /** + * 还原被替换的literal标签 + * @access private + * @param string $tag literal标签序号 + * @return string|false + */ + private function restoreLiteral($tag) { + if(is_array($tag)) $tag = $tag[1]; + // 还原literal标签 + $parseStr = $this->literal[$tag]; + // 销毁literal记录 + unset($this->literal[$tag]); + return $parseStr; + } + + /** + * 记录当前页面中的block标签 + * @access private + * @param string $name block名称 + * @param string $content 模板内容 + * @return string + */ + private function parseBlock($name,$content = '') { + if(is_array($name)){ + $content = $name[2]; + $name = $name[1]; + } + $this->block[$name] = $content; + return ''; + } + + /** + * 替换继承模板中的block标签 + * @access private + * @param string $content 模板内容 + * @return string + */ + private function replaceBlock($content){ + static $parse = 0; + $begin = $this->config['taglib_begin']; + $end = $this->config['taglib_end']; + $reg = '/('.$begin.'block\sname=[\'"](.+?)[\'"]\s*?'.$end.')(.*?)'.$begin.'\/block'.$end.'/is'; + if(is_string($content)){ + do{ + $content = preg_replace_callback($reg, array($this, 'replaceBlock'), $content); + } while ($parse && $parse--); + return $content; + } elseif(is_array($content)){ + if(preg_match('/'.$begin.'block\sname=[\'"](.+?)[\'"]\s*?'.$end.'/is', $content[3])){ //存在嵌套,进一步解析 + $parse = 1; + $content[3] = preg_replace_callback($reg, array($this, 'replaceBlock'), "{$content[3]}{$begin}/block{$end}"); + return $content[1] . $content[3]; + } else { + $name = $content[2]; + $content = $content[3]; + $content = isset($this->block[$name]) ? $this->block[$name] : $content; + return $content; + } + } + } + + /** + * 搜索模板页面中包含的TagLib库 + * 并返回列表 + * @access public + * @param string $content 模板内容 + * @return string|false + */ + public function getIncludeTagLib(& $content) { + //搜索是否有TagLib标签 + $find = preg_match('/'.$this->config['taglib_begin'].'taglib\s(.+?)(\s*?)\/'.$this->config['taglib_end'].'\W/is',$content,$matches); + if($find) { + //替换TagLib标签 + $content = str_replace($matches[0],'',$content); + //解析TagLib标签 + $array = $this->parseXmlAttrs($matches[1]); + $this->tagLib = explode(',',$array['name']); + } + return; + } + + /** + * TagLib库解析 + * @access public + * @param string $tagLib 要解析的标签库 + * @param string $content 要解析的模板内容 + * @param boolean $hide 是否隐藏标签库前缀 + * @return string + */ + public function parseTagLib($tagLib,&$content,$hide=false) { + $begin = $this->config['taglib_begin']; + $end = $this->config['taglib_end']; + if(strpos($tagLib,'\\')){ + // 支持指定标签库的命名空间 + $className = $tagLib; + $tagLib = substr($tagLib,strrpos($tagLib,'\\')+1); + }else{ + $className = 'Think\\Template\TagLib\\'.ucwords($tagLib); + } + $tLib = \Think\Think::instance($className); + $that = $this; + foreach ($tLib->getTags() as $name=>$val){ + $tags = array($name); + if(isset($val['alias'])) {// 别名设置 + $tags = explode(',',$val['alias']); + $tags[] = $name; + } + $level = isset($val['level'])?$val['level']:1; + $closeTag = isset($val['close'])?$val['close']:true; + foreach ($tags as $tag){ + $parseTag = !$hide? $tagLib.':'.$tag: $tag;// 实际要解析的标签名称 + if(!method_exists($tLib,'_'.$tag)) { + // 别名可以无需定义解析方法 + $tag = $name; + } + $n1 = empty($val['attr'])?'(\s*?)':'\s([^'.$end.']*)'; + $this->tempVar = array($tagLib, $tag); + + if (!$closeTag){ + $patterns = '/'.$begin.$parseTag.$n1.'\/(\s*?)'.$end.'/is'; + $content = preg_replace_callback($patterns, function($matches) use($tLib,$tag,$that){ + return $that->parseXmlTag($tLib,$tag,$matches[1],$matches[2]); + },$content); + }else{ + $patterns = '/'.$begin.$parseTag.$n1.$end.'(.*?)'.$begin.'\/'.$parseTag.'(\s*?)'.$end.'/is'; + for($i=0;$i<$level;$i++) { + $content=preg_replace_callback($patterns,function($matches) use($tLib,$tag,$that){ + return $that->parseXmlTag($tLib,$tag,$matches[1],$matches[2]); + },$content); + } + } + } + } + } + + /** + * 解析标签库的标签 + * 需要调用对应的标签库文件解析类 + * @access public + * @param object $tagLib 标签库对象实例 + * @param string $tag 标签名 + * @param string $attr 标签属性 + * @param string $content 标签内容 + * @return string|false + */ + public function parseXmlTag($tagLib,$tag,$attr,$content) { + if(ini_get('magic_quotes_sybase')) + $attr = str_replace('\"','\'',$attr); + $parse = '_'.$tag; + $content = trim($content); + $tags = $tagLib->parseXmlAttr($attr,$tag); + return $tagLib->$parse($tags,$content); + } + + /** + * 模板标签解析 + * 格式: {TagName:args [|content] } + * @access public + * @param string $tagStr 标签内容 + * @return string + */ + public function parseTag($tagStr){ + if(is_array($tagStr)) $tagStr = $tagStr[2]; + //if (MAGIC_QUOTES_GPC) { + $tagStr = stripslashes($tagStr); + //} + $flag = substr($tagStr,0,1); + $flag2 = substr($tagStr,1,1); + $name = substr($tagStr,1); + if('$' == $flag && '.' != $flag2 && '(' != $flag2){ //解析模板变量 格式 {$varName} + return $this->parseVar($name); + }elseif('-' == $flag || '+'== $flag){ // 输出计算 + return '<?php echo '.$flag.$name.';?>'; + }elseif(':' == $flag){ // 输出某个函数的结果 + return '<?php echo '.$name.';?>'; + }elseif('~' == $flag){ // 执行某个函数 + return '<?php '.$name.';?>'; + }elseif(substr($tagStr,0,2)=='//' || (substr($tagStr,0,2)=='/*' && substr(rtrim($tagStr),-2)=='*/')){ + //注释标签 + return ''; + } + // 未识别的标签直接返回 + return C('TMPL_L_DELIM') . $tagStr .C('TMPL_R_DELIM'); + } + + /** + * 模板变量解析,支持使用函数 + * 格式: {$varname|function1|function2=arg1,arg2} + * @access public + * @param string $varStr 变量数据 + * @return string + */ + public function parseVar($varStr){ + $varStr = trim($varStr); + static $_varParseList = array(); + //如果已经解析过该变量字串,则直接返回变量值 + if(isset($_varParseList[$varStr])) return $_varParseList[$varStr]; + $parseStr = ''; + $varExists = true; + if(!empty($varStr)){ + $varArray = explode('|',$varStr); + //取得变量名称 + $var = array_shift($varArray); + if('Think.' == substr($var,0,6)){ + // 所有以Think.打头的以特殊变量对待 无需模板赋值就可以输出 + $name = $this->parseThinkVar($var); + }elseif( false !== strpos($var,'.')) { + //支持 {$var.property} + $vars = explode('.',$var); + $var = array_shift($vars); + switch(strtolower(C('TMPL_VAR_IDENTIFY'))) { + case 'array': // 识别为数组 + $name = '$'.$var; + foreach ($vars as $key=>$val) + $name .= '["'.$val.'"]'; + break; + case 'obj': // 识别为对象 + $name = '$'.$var; + foreach ($vars as $key=>$val) + $name .= '->'.$val; + break; + default: // 自动判断数组或对象 只支持二维 + $name = 'is_array($'.$var.')?$'.$var.'["'.$vars[0].'"]:$'.$var.'->'.$vars[0]; + } + }elseif(false !== strpos($var,'[')) { + //支持 {$var['key']} 方式输出数组 + $name = "$".$var; + preg_match('/(.+?)\[(.+?)\]/is',$var,$match); + $var = $match[1]; + }elseif(false !==strpos($var,':') && false ===strpos($var,'(') && false ===strpos($var,'::') && false ===strpos($var,'?')){ + //支持 {$var:property} 方式输出对象的属性 + $vars = explode(':',$var); + $var = str_replace(':','->',$var); + $name = "$".$var; + $var = $vars[0]; + }else { + $name = "$$var"; + } + //对变量使用函数 + if(count($varArray)>0) + $name = $this->parseVarFunction($name,$varArray); + $parseStr = '<?php echo ('.$name.'); ?>'; + } + $_varParseList[$varStr] = $parseStr; + return $parseStr; + } + + /** + * 对模板变量使用函数 + * 格式 {$varname|function1|function2=arg1,arg2} + * @access public + * @param string $name 变量名 + * @param array $varArray 函数列表 + * @return string + */ + public function parseVarFunction($name,$varArray){ + //对变量使用函数 + $length = count($varArray); + //取得模板禁止使用函数列表 + $template_deny_funs = explode(',',C('TMPL_DENY_FUNC_LIST')); + for($i=0;$i<$length ;$i++ ){ + $args = explode('=',$varArray[$i],2); + //模板函数过滤 + $fun = trim($args[0]); + switch($fun) { + case 'default': // 特殊模板函数 + $name = '(isset('.$name.') && ('.$name.' !== ""))?('.$name.'):'.$args[1]; + break; + default: // 通用模板函数 + if(!in_array($fun,$template_deny_funs)){ + if(isset($args[1])){ + if(strstr($args[1],'###')){ + $args[1] = str_replace('###',$name,$args[1]); + $name = "$fun($args[1])"; + }else{ + $name = "$fun($name,$args[1])"; + } + }else if(!empty($args[0])){ + $name = "$fun($name)"; + } + } + } + } + return $name; + } + + /** + * 特殊模板变量解析 + * 格式 以 $Think. 打头的变量属于特殊模板变量 + * @access public + * @param string $varStr 变量字符串 + * @return string + */ + public function parseThinkVar($varStr){ + $vars = explode('.',$varStr); + $vars[1] = strtoupper(trim($vars[1])); + $parseStr = ''; + if(count($vars)>=3){ + $vars[2] = trim($vars[2]); + switch($vars[1]){ + case 'SERVER': + $parseStr = '$_SERVER[\''.strtoupper($vars[2]).'\']';break; + case 'GET': + $parseStr = '$_GET[\''.$vars[2].'\']';break; + case 'POST': + $parseStr = '$_POST[\''.$vars[2].'\']';break; + case 'COOKIE': + if(isset($vars[3])) { + $parseStr = '$_COOKIE[\''.$vars[2].'\'][\''.$vars[3].'\']'; + }else{ + $parseStr = 'cookie(\''.$vars[2].'\')'; + } + break; + case 'SESSION': + if(isset($vars[3])) { + $parseStr = '$_SESSION[\''.$vars[2].'\'][\''.$vars[3].'\']'; + }else{ + $parseStr = 'session(\''.$vars[2].'\')'; + } + break; + case 'ENV': + $parseStr = '$_ENV[\''.strtoupper($vars[2]).'\']';break; + case 'REQUEST': + $parseStr = '$_REQUEST[\''.$vars[2].'\']';break; + case 'CONST': + $parseStr = strtoupper($vars[2]);break; + case 'LANG': + $parseStr = 'L("'.$vars[2].'")';break; + case 'CONFIG': + if(isset($vars[3])) { + $vars[2] .= '.'.$vars[3]; + } + $parseStr = 'C("'.$vars[2].'")';break; + default:break; + } + }else if(count($vars)==2){ + switch($vars[1]){ + case 'NOW': + $parseStr = "date('Y-m-d g:i a',time())"; + break; + case 'VERSION': + $parseStr = 'THINK_VERSION'; + break; + case 'TEMPLATE': + $parseStr = "'".$this->templateFile."'";//'C("TEMPLATE_NAME")'; + break; + case 'LDELIM': + $parseStr = 'C("TMPL_L_DELIM")'; + break; + case 'RDELIM': + $parseStr = 'C("TMPL_R_DELIM")'; + break; + default: + if(defined($vars[1])) + $parseStr = $vars[1]; + } + } + return $parseStr; + } + + /** + * 加载公共模板并缓存 和当前模板在同一路径,否则使用相对路径 + * @access private + * @param string $tmplPublicName 公共模板文件名 + * @param array $vars 要传递的变量列表 + * @return string + */ + private function parseIncludeItem($tmplPublicName,$vars=array(),$extend){ + // 分析模板文件名并读取内容 + $parseStr = $this->parseTemplateName($tmplPublicName); + // 替换变量 + foreach ($vars as $key=>$val) { + $parseStr = str_replace('['.$key.']',$val,$parseStr); + } + // 再次对包含文件进行模板分析 + return $this->parseInclude($parseStr,$extend); + } + + /** + * 分析加载的模板文件并读取内容 支持多个模板文件读取 + * @access private + * @param string $tmplPublicName 模板文件名 + * @return string + */ + private function parseTemplateName($templateName){ + if(substr($templateName,0,1)=='$') + //支持加载变量文件名 + $templateName = $this->get(substr($templateName,1)); + $array = explode(',',$templateName); + $parseStr = ''; + foreach ($array as $templateName){ + if(empty($templateName)) continue; + if(false === strpos($templateName,$this->config['template_suffix'])) { + // 解析规则为 模块@主题/控制器/操作 + $templateName = T($templateName); + } + // 获取模板文件内容 + $parseStr .= file_get_contents($templateName); + } + return $parseStr; + } +} diff --git a/ThinkPHP/Library/Think/Template/Driver/Ease.class.php b/ThinkPHP/Library/Think/Template/Driver/Ease.class.php new file mode 100644 index 0000000..192bde0 --- /dev/null +++ b/ThinkPHP/Library/Think/Template/Driver/Ease.class.php @@ -0,0 +1,41 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Template\Driver; +/** + * EaseTemplate模板引擎驱动 + */ +class Ease { + /** + * 渲染模板输出 + * @access public + * @param string $templateFile 模板文件名 + * @param array $var 模板变量 + * @return void + */ + public function fetch($templateFile,$var) { + $templateFile = substr($templateFile,strlen(THEME_PATH),-5); + $CacheDir = substr(CACHE_PATH,0,-1); + $TemplateDir = substr(THEME_PATH,0,-1); + vendor('EaseTemplate.template#ease'); + $config = array( + 'CacheDir' => $CacheDir, + 'TemplateDir' => $TemplateDir, + 'TplType' => 'html' + ); + if(C('TMPL_ENGINE_CONFIG')) { + $config = array_merge($config,C('TMPL_ENGINE_CONFIG')); + } + $tpl = new \EaseTemplate($config); + $tpl->set_var($var); + $tpl->set_file($templateFile); + $tpl->p(); + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Template/Driver/Lite.class.php b/ThinkPHP/Library/Think/Template/Driver/Lite.class.php new file mode 100644 index 0000000..5f73a02 --- /dev/null +++ b/ThinkPHP/Library/Think/Template/Driver/Lite.class.php @@ -0,0 +1,39 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Template\Driver; +/** + * TemplateLite模板引擎驱动 + */ +class Lite { + /** + * 渲染模板输出 + * @access public + * @param string $templateFile 模板文件名 + * @param array $var 模板变量 + * @return void + */ + public function fetch($templateFile,$var) { + vendor("TemplateLite.class#template"); + $templateFile = substr($templateFile,strlen(THEME_PATH)); + $tpl = new \Template_Lite(); + $tpl->template_dir = THEME_PATH; + $tpl->compile_dir = CACHE_PATH ; + $tpl->cache_dir = TEMP_PATH ; + if(C('TMPL_ENGINE_CONFIG')) { + $config = C('TMPL_ENGINE_CONFIG'); + foreach ($config as $key=>$val){ + $tpl->{$key} = $val; + } + } + $tpl->assign($var); + $tpl->display($templateFile); + } +} \ No newline at end of file diff --git a/thinkphp/library/think/log/driver/Test.php b/ThinkPHP/Library/Think/Template/Driver/Mobile.class.php old mode 100755 new mode 100644 similarity index 50% rename from thinkphp/library/think/log/driver/Test.php rename to ThinkPHP/Library/Think/Template/Driver/Mobile.class.php index 7f66338..db39e7f --- a/thinkphp/library/think/log/driver/Test.php +++ b/ThinkPHP/Library/Think/Template/Driver/Mobile.class.php @@ -2,29 +2,27 @@ // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> +// | Author: luofei614<weibo.com/luofei614> // +---------------------------------------------------------------------- - -namespace think\log\driver; - +namespace Think\Template\Driver; /** - * 模拟测试输出 + * MobileTemplate模板引擎驱动 */ -class Test -{ +class Mobile { /** - * 日志写入接口 + * 渲染模板输出 * @access public - * @param array $log 日志信息 - * @return bool + * @param string $templateFile 模板文件名 + * @param array $var 模板变量 + * @return void */ - public function save(array $log = []) - { - return true; + public function fetch($templateFile,$var) { + $templateFile=substr($templateFile,strlen(THEME_PATH)); + $var['_think_template_path']=$templateFile; + exit(json_encode($var)); } - } diff --git a/ThinkPHP/Library/Think/Template/Driver/Smart.class.php b/ThinkPHP/Library/Think/Template/Driver/Smart.class.php new file mode 100644 index 0000000..5a2eb1c --- /dev/null +++ b/ThinkPHP/Library/Think/Template/Driver/Smart.class.php @@ -0,0 +1,40 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Template\Driver; +/** + * Smart模板引擎驱动 + */ +class Smart { + /** + * 渲染模板输出 + * @access public + * @param string $templateFile 模板文件名 + * @param array $var 模板变量 + * @return void + */ + public function fetch($templateFile,$var) { + $templateFile = substr($templateFile,strlen(THEME_PATH)); + vendor('SmartTemplate.class#smarttemplate'); + $tpl = new \SmartTemplate($templateFile); + $tpl->caching = C('TMPL_CACHE_ON'); + $tpl->template_dir = THEME_PATH; + $tpl->compile_dir = CACHE_PATH ; + $tpl->cache_dir = TEMP_PATH ; + if(C('TMPL_ENGINE_CONFIG')) { + $config = C('TMPL_ENGINE_CONFIG'); + foreach ($config as $key=>$val){ + $tpl->{$key} = $val; + } + } + $tpl->assign($var); + $tpl->output(); + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Template/Driver/Smarty.class.php b/ThinkPHP/Library/Think/Template/Driver/Smarty.class.php new file mode 100644 index 0000000..aecdc10 --- /dev/null +++ b/ThinkPHP/Library/Think/Template/Driver/Smarty.class.php @@ -0,0 +1,41 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Template\Driver; +/** + * Smarty模板引擎驱动 + */ +class Smarty { + + /** + * 渲染模板输出 + * @access public + * @param string $templateFile 模板文件名 + * @param array $var 模板变量 + * @return void + */ + public function fetch($templateFile,$var) { + $templateFile = substr($templateFile,strlen(THEME_PATH)); + vendor('Smarty.Smarty#class'); + $tpl = new \Smarty(); + $tpl->caching = C('TMPL_CACHE_ON'); + $tpl->template_dir = THEME_PATH; + $tpl->compile_dir = CACHE_PATH ; + $tpl->cache_dir = TEMP_PATH ; + if(C('TMPL_ENGINE_CONFIG')) { + $config = C('TMPL_ENGINE_CONFIG'); + foreach ($config as $key=>$val){ + $tpl->{$key} = $val; + } + } + $tpl->assign($var); + $tpl->display($templateFile); + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Template/TagLib.class.php b/ThinkPHP/Library/Think/Template/TagLib.class.php new file mode 100644 index 0000000..18e3be8 --- /dev/null +++ b/ThinkPHP/Library/Think/Template/TagLib.class.php @@ -0,0 +1,246 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Template; +/** + * ThinkPHP标签库TagLib解析基类 + */ +class TagLib { + + /** + * 标签库定义XML文件 + * @var string + * @access protected + */ + protected $xml = ''; + protected $tags = array();// 标签定义 + /** + * 标签库名称 + * @var string + * @access protected + */ + protected $tagLib =''; + + /** + * 标签库标签列表 + * @var string + * @access protected + */ + protected $tagList = array(); + + /** + * 标签库分析数组 + * @var string + * @access protected + */ + protected $parse = array(); + + /** + * 标签库是否有效 + * @var string + * @access protected + */ + protected $valid = false; + + /** + * 当前模板对象 + * @var object + * @access protected + */ + protected $tpl; + + protected $comparison = array(' nheq '=>' !== ',' heq '=>' === ',' neq '=>' != ',' eq '=>' == ',' egt '=>' >= ',' gt '=>' > ',' elt '=>' <= ',' lt '=>' < '); + + /** + * 架构函数 + * @access public + */ + public function __construct() { + $this->tagLib = strtolower(substr(get_class($this),6)); + $this->tpl = \Think\Think::instance('Think\\Template'); + } + + /** + * TagLib标签属性分析 返回标签属性数组 + * @access public + * @param string $tagStr 标签内容 + * @return array + */ + public function parseXmlAttr($attr,$tag) { + //XML解析安全过滤 + $attr = str_replace('&','___', $attr); + $xml = '<tpl><tag '.$attr.' /></tpl>'; + $xml = simplexml_load_string($xml); + if(!$xml) { + E(L('_XML_TAG_ERROR_').' : '.$attr); + } + $xml = (array)($xml->tag->attributes()); + if(isset($xml['@attributes'])){ + $array = array_change_key_case($xml['@attributes']); + if($array) { + $tag = strtolower($tag); + if(!isset($this->tags[$tag])){ + // 检测是否存在别名定义 + foreach($this->tags as $key=>$val){ + if(isset($val['alias']) && in_array($tag,explode(',',$val['alias']))){ + $item = $val; + break; + } + } + }else{ + $item = $this->tags[$tag]; + } + $attrs = explode(',',$item['attr']); + if(isset($item['must'])){ + $must = explode(',',$item['must']); + }else{ + $must = array(); + } + foreach($attrs as $name) { + if( isset($array[$name])) { + $array[$name] = str_replace('___','&',$array[$name]); + }elseif(false !== array_search($name,$must)){ + E(L('_PARAM_ERROR_').':'.$name); + } + } + return $array; + } + }else{ + return array(); + } + } + + /** + * 解析条件表达式 + * @access public + * @param string $condition 表达式标签内容 + * @return array + */ + public function parseCondition($condition) { + $condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition); + $condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition); + switch(strtolower(C('TMPL_VAR_IDENTIFY'))) { + case 'array': // 识别为数组 + $condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition); + break; + case 'obj': // 识别为对象 + $condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1->\\2 ',$condition); + break; + default: // 自动判断数组或对象 只支持二维 + $condition = preg_replace('/\$(\w+)\.(\w+)\s/is','(is_array($\\1)?$\\1["\\2"]:$\\1->\\2) ',$condition); + } + if(false !== strpos($condition, '$Think')) + $condition = preg_replace_callback('/(\$Think.*?)\s/is', array($this, 'parseThinkVar'), $condition); + return $condition; + } + + /** + * 自动识别构建变量 + * @access public + * @param string $name 变量描述 + * @return string + */ + public function autoBuildVar($name) { + if('Think.' == substr($name,0,6)){ + // 特殊变量 + return $this->parseThinkVar($name); + }elseif(strpos($name,'.')) { + $vars = explode('.',$name); + $var = array_shift($vars); + switch(strtolower(C('TMPL_VAR_IDENTIFY'))) { + case 'array': // 识别为数组 + $name = '$'.$var; + foreach ($vars as $key=>$val){ + if(0===strpos($val,'$')) { + $name .= '["{'.$val.'}"]'; + }else{ + $name .= '["'.$val.'"]'; + } + } + break; + case 'obj': // 识别为对象 + $name = '$'.$var; + foreach ($vars as $key=>$val) + $name .= '->'.$val; + break; + default: // 自动判断数组或对象 只支持二维 + $name = 'is_array($'.$var.')?$'.$var.'["'.$vars[0].'"]:$'.$var.'->'.$vars[0]; + } + }elseif(strpos($name,':')){ + // 额外的对象方式支持 + $name = '$'.str_replace(':','->',$name); + }elseif(!defined($name)) { + $name = '$'.$name; + } + return $name; + } + + /** + * 用于标签属性里面的特殊模板变量解析 + * 格式 以 Think. 打头的变量属于特殊模板变量 + * @access public + * @param string $varStr 变量字符串 + * @return string + */ + public function parseThinkVar($varStr){ + if(is_array($varStr)){//用于正则替换回调函数 + $varStr = $varStr[1]; + } + $vars = explode('.',$varStr); + $vars[1] = strtoupper(trim($vars[1])); + $parseStr = ''; + if(count($vars)>=3){ + $vars[2] = trim($vars[2]); + switch($vars[1]){ + case 'SERVER': $parseStr = '$_SERVER[\''.$vars[2].'\']';break; + case 'GET': $parseStr = '$_GET[\''.$vars[2].'\']';break; + case 'POST': $parseStr = '$_POST[\''.$vars[2].'\']';break; + case 'COOKIE': + if(isset($vars[3])) { + $parseStr = '$_COOKIE[\''.$vars[2].'\'][\''.$vars[3].'\']'; + }elseif(C('COOKIE_PREFIX')){ + $parseStr = '$_COOKIE[\''.C('COOKIE_PREFIX').$vars[2].'\']'; + }else{ + $parseStr = '$_COOKIE[\''.$vars[2].'\']'; + } + break; + case 'SESSION': + if(isset($vars[3])) { + $parseStr = '$_SESSION[\''.$vars[2].'\'][\''.$vars[3].'\']'; + }elseif(C('SESSION_PREFIX')){ + $parseStr = '$_SESSION[\''.C('SESSION_PREFIX').'\'][\''.$vars[2].'\']'; + }else{ + $parseStr = '$_SESSION[\''.$vars[2].'\']'; + } + break; + case 'ENV': $parseStr = '$_ENV[\''.$vars[2].'\']';break; + case 'REQUEST': $parseStr = '$_REQUEST[\''.$vars[2].'\']';break; + case 'CONST': $parseStr = strtoupper($vars[2]);break; + case 'LANG': $parseStr = 'L("'.$vars[2].'")';break; + case 'CONFIG': $parseStr = 'C("'.$vars[2].'")';break; + } + }else if(count($vars)==2){ + switch($vars[1]){ + case 'NOW': $parseStr = "date('Y-m-d g:i a',time())";break; + case 'VERSION': $parseStr = 'THINK_VERSION';break; + case 'TEMPLATE':$parseStr = 'C("TEMPLATE_NAME")';break; + case 'LDELIM': $parseStr = 'C("TMPL_L_DELIM")';break; + case 'RDELIM': $parseStr = 'C("TMPL_R_DELIM")';break; + default: if(defined($vars[1])) $parseStr = $vars[1]; + } + } + return $parseStr; + } + + // 获取标签定义 + public function getTags(){ + return $this->tags; + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Template/TagLib/Cx.class.php b/ThinkPHP/Library/Think/Template/TagLib/Cx.class.php new file mode 100644 index 0000000..67b5dd4 --- /dev/null +++ b/ThinkPHP/Library/Think/Template/TagLib/Cx.class.php @@ -0,0 +1,614 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Template\TagLib; +use Think\Template\TagLib; +/** + * CX标签库解析类 + */ +class Cx extends TagLib { + + // 标签定义 + protected $tags = array( + // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 + 'php' => array(), + 'volist' => array('attr'=>'name,id,offset,length,key,mod','level'=>3,'alias'=>'iterate'), + 'foreach' => array('attr'=>'name,item,key','level'=>3), + 'if' => array('attr'=>'condition','level'=>2), + 'elseif' => array('attr'=>'condition','close'=>0), + 'else' => array('attr'=>'','close'=>0), + 'switch' => array('attr'=>'name','level'=>2), + 'case' => array('attr'=>'value,break'), + 'default' => array('attr'=>'','close'=>0), + 'compare' => array('attr'=>'name,value,type','level'=>3,'alias'=>'eq,equal,notequal,neq,gt,lt,egt,elt,heq,nheq'), + 'range' => array('attr'=>'name,value,type','level'=>3,'alias'=>'in,notin,between,notbetween'), + 'empty' => array('attr'=>'name','level'=>3), + 'notempty' => array('attr'=>'name','level'=>3), + 'present' => array('attr'=>'name','level'=>3), + 'notpresent'=> array('attr'=>'name','level'=>3), + 'defined' => array('attr'=>'name','level'=>3), + 'notdefined'=> array('attr'=>'name','level'=>3), + 'import' => array('attr'=>'file,href,type,value,basepath','close'=>0,'alias'=>'load,css,js'), + 'assign' => array('attr'=>'name,value','close'=>0), + 'define' => array('attr'=>'name,value','close'=>0), + 'for' => array('attr'=>'start,end,name,comparison,step', 'level'=>3), + ); + + /** + * php标签解析 + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _php($tag,$content) { + $parseStr = '<?php '.$content.' ?>'; + return $parseStr; + } + + /** + * volist标签解析 循环输出数据集 + * 格式: + * <volist name="userList" id="user" empty="" > + * {user.username} + * {user.email} + * </volist> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string|void + */ + public function _volist($tag,$content) { + $name = $tag['name']; + $id = $tag['id']; + $empty = isset($tag['empty'])?$tag['empty']:''; + $key = !empty($tag['key'])?$tag['key']:'i'; + $mod = isset($tag['mod'])?$tag['mod']:'2'; + // 允许使用函数设定数据集 <volist name=":fun('arg')" id="vo">{$vo.name}</volist> + $parseStr = '<?php '; + if(0===strpos($name,':')) { + $parseStr .= '$_result='.substr($name,1).';'; + $name = '$_result'; + }else{ + $name = $this->autoBuildVar($name); + } + $parseStr .= 'if(is_array('.$name.')): $'.$key.' = 0;'; + if(isset($tag['length']) && '' !=$tag['length'] ) { + $parseStr .= ' $__LIST__ = array_slice('.$name.','.$tag['offset'].','.$tag['length'].',true);'; + }elseif(isset($tag['offset']) && '' !=$tag['offset']){ + $parseStr .= ' $__LIST__ = array_slice('.$name.','.$tag['offset'].',null,true);'; + }else{ + $parseStr .= ' $__LIST__ = '.$name.';'; + } + $parseStr .= 'if( count($__LIST__)==0 ) : echo "'.$empty.'" ;'; + $parseStr .= 'else: '; + $parseStr .= 'foreach($__LIST__ as $key=>$'.$id.'): '; + $parseStr .= '$mod = ($'.$key.' % '.$mod.' );'; + $parseStr .= '++$'.$key.';?>'; + $parseStr .= $this->tpl->parse($content); + $parseStr .= '<?php endforeach; endif; else: echo "'.$empty.'" ;endif; ?>'; + + if(!empty($parseStr)) { + return $parseStr; + } + return ; + } + + /** + * foreach标签解析 循环输出数据集 + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string|void + */ + public function _foreach($tag,$content) { + $name = $tag['name']; + $item = $tag['item']; + $key = !empty($tag['key'])?$tag['key']:'key'; + $name = $this->autoBuildVar($name); + $parseStr = '<?php if(is_array('.$name.')): foreach('.$name.' as $'.$key.'=>$'.$item.'): ?>'; + $parseStr .= $this->tpl->parse($content); + $parseStr .= '<?php endforeach; endif; ?>'; + + if(!empty($parseStr)) { + return $parseStr; + } + return ; + } + + /** + * if标签解析 + * 格式: + * <if condition=" $a eq 1" > + * <elseif condition="$a eq 2" /> + * <else /> + * </if> + * 表达式支持 eq neq gt egt lt elt == > >= < <= or and || && + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _if($tag,$content) { + $condition = $this->parseCondition($tag['condition']); + $parseStr = '<?php if('.$condition.'): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + /** + * else标签解析 + * 格式:见if标签 + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _elseif($tag,$content) { + $condition = $this->parseCondition($tag['condition']); + $parseStr = '<?php elseif('.$condition.'): ?>'; + return $parseStr; + } + + /** + * else标签解析 + * @access public + * @param array $tag 标签属性 + * @return string + */ + public function _else($tag) { + $parseStr = '<?php else: ?>'; + return $parseStr; + } + + /** + * switch标签解析 + * 格式: + * <switch name="a.name" > + * <case value="1" break="false">1</case> + * <case value="2" >2</case> + * <default />other + * </switch> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _switch($tag,$content) { + $name = $tag['name']; + $varArray = explode('|',$name); + $name = array_shift($varArray); + $name = $this->autoBuildVar($name); + if(count($varArray)>0) + $name = $this->tpl->parseVarFunction($name,$varArray); + $parseStr = '<?php switch('.$name.'): ?>'.$content.'<?php endswitch;?>'; + return $parseStr; + } + + /** + * case标签解析 需要配合switch才有效 + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _case($tag,$content) { + $value = $tag['value']; + if('$' == substr($value,0,1)) { + $varArray = explode('|',$value); + $value = array_shift($varArray); + $value = $this->autoBuildVar(substr($value,1)); + if(count($varArray)>0) + $value = $this->tpl->parseVarFunction($value,$varArray); + $value = 'case '.$value.': '; + }elseif(strpos($value,'|')){ + $values = explode('|',$value); + $value = ''; + foreach ($values as $val){ + $value .= 'case "'.addslashes($val).'": '; + } + }else{ + $value = 'case "'.$value.'": '; + } + $parseStr = '<?php '.$value.' ?>'.$content; + $isBreak = isset($tag['break']) ? $tag['break'] : ''; + if('' ==$isBreak || $isBreak) { + $parseStr .= '<?php break;?>'; + } + return $parseStr; + } + + /** + * default标签解析 需要配合switch才有效 + * 使用: <default />ddfdf + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _default($tag) { + $parseStr = '<?php default: ?>'; + return $parseStr; + } + + /** + * compare标签解析 + * 用于值的比较 支持 eq neq gt lt egt elt heq nheq 默认是eq + * 格式: <compare name="" type="eq" value="" >content</compare> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _compare($tag,$content,$type='eq') { + $name = $tag['name']; + $value = $tag['value']; + $type = isset($tag['type'])?$tag['type']:$type; + $type = $this->parseCondition(' '.$type.' '); + $varArray = explode('|',$name); + $name = array_shift($varArray); + $name = $this->autoBuildVar($name); + if(count($varArray)>0) + $name = $this->tpl->parseVarFunction($name,$varArray); + if('$' == substr($value,0,1)) { + $value = $this->autoBuildVar(substr($value,1)); + }else { + $value = '"'.$value.'"'; + } + $parseStr = '<?php if(('.$name.') '.$type.' '.$value.'): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + public function _eq($tag,$content) { + return $this->_compare($tag,$content,'eq'); + } + + public function _equal($tag,$content) { + return $this->_compare($tag,$content,'eq'); + } + + public function _neq($tag,$content) { + return $this->_compare($tag,$content,'neq'); + } + + public function _notequal($tag,$content) { + return $this->_compare($tag,$content,'neq'); + } + + public function _gt($tag,$content) { + return $this->_compare($tag,$content,'gt'); + } + + public function _lt($tag,$content) { + return $this->_compare($tag,$content,'lt'); + } + + public function _egt($tag,$content) { + return $this->_compare($tag,$content,'egt'); + } + + public function _elt($tag,$content) { + return $this->_compare($tag,$content,'elt'); + } + + public function _heq($tag,$content) { + return $this->_compare($tag,$content,'heq'); + } + + public function _nheq($tag,$content) { + return $this->_compare($tag,$content,'nheq'); + } + + /** + * range标签解析 + * 如果某个变量存在于某个范围 则输出内容 type= in 表示在范围内 否则表示在范围外 + * 格式: <range name="var|function" value="val" type='in|notin' >content</range> + * example: <range name="a" value="1,2,3" type='in' >content</range> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @param string $type 比较类型 + * @return string + */ + public function _range($tag,$content,$type='in') { + $name = $tag['name']; + $value = $tag['value']; + $varArray = explode('|',$name); + $name = array_shift($varArray); + $name = $this->autoBuildVar($name); + if(count($varArray)>0) + $name = $this->tpl->parseVarFunction($name,$varArray); + + $type = isset($tag['type'])?$tag['type']:$type; + + if('$' == substr($value,0,1)) { + $value = $this->autoBuildVar(substr($value,1)); + $str = 'is_array('.$value.')?'.$value.':explode(\',\','.$value.')'; + }else{ + $value = '"'.$value.'"'; + $str = 'explode(\',\','.$value.')'; + } + if($type=='between') { + $parseStr = '<?php $_RANGE_VAR_='.$str.';if('.$name.'>= $_RANGE_VAR_[0] && '.$name.'<= $_RANGE_VAR_[1]):?>'.$content.'<?php endif; ?>'; + }elseif($type=='notbetween'){ + $parseStr = '<?php $_RANGE_VAR_='.$str.';if('.$name.'<$_RANGE_VAR_[0] || '.$name.'>$_RANGE_VAR_[1]):?>'.$content.'<?php endif; ?>'; + }else{ + $fun = ($type == 'in')? 'in_array' : '!in_array'; + $parseStr = '<?php if('.$fun.'(('.$name.'), '.$str.')): ?>'.$content.'<?php endif; ?>'; + } + return $parseStr; + } + + // range标签的别名 用于in判断 + public function _in($tag,$content) { + return $this->_range($tag,$content,'in'); + } + + // range标签的别名 用于notin判断 + public function _notin($tag,$content) { + return $this->_range($tag,$content,'notin'); + } + + public function _between($tag,$content){ + return $this->_range($tag,$content,'between'); + } + + public function _notbetween($tag,$content){ + return $this->_range($tag,$content,'notbetween'); + } + + /** + * present标签解析 + * 如果某个变量已经设置 则输出内容 + * 格式: <present name="" >content</present> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _present($tag,$content) { + $name = $tag['name']; + $name = $this->autoBuildVar($name); + $parseStr = '<?php if(isset('.$name.')): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + /** + * notpresent标签解析 + * 如果某个变量没有设置,则输出内容 + * 格式: <notpresent name="" >content</notpresent> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _notpresent($tag,$content) { + $name = $tag['name']; + $name = $this->autoBuildVar($name); + $parseStr = '<?php if(!isset('.$name.')): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + /** + * empty标签解析 + * 如果某个变量为empty 则输出内容 + * 格式: <empty name="" >content</empty> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _empty($tag,$content) { + $name = $tag['name']; + $name = $this->autoBuildVar($name); + $parseStr = '<?php if(empty('.$name.')): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + public function _notempty($tag,$content) { + $name = $tag['name']; + $name = $this->autoBuildVar($name); + $parseStr = '<?php if(!empty('.$name.')): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + /** + * 判断是否已经定义了该常量 + * <defined name='TXT'>已定义</defined> + * @param <type> $attr + * @param <type> $content + * @return string + */ + public function _defined($tag,$content) { + $name = $tag['name']; + $parseStr = '<?php if(defined("'.$name.'")): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + public function _notdefined($tag,$content) { + $name = $tag['name']; + $parseStr = '<?php if(!defined("'.$name.'")): ?>'.$content.'<?php endif; ?>'; + return $parseStr; + } + + /** + * import 标签解析 <import file="Js.Base" /> + * <import file="Css.Base" type="css" /> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @param boolean $isFile 是否文件方式 + * @param string $type 类型 + * @return string + */ + public function _import($tag,$content,$isFile=false,$type='') { + $file = isset($tag['file'])?$tag['file']:$tag['href']; + $parseStr = ''; + $endStr = ''; + // 判断是否存在加载条件 允许使用函数判断(默认为isset) + if (isset($tag['value'])) { + $varArray = explode('|',$tag['value']); + $name = array_shift($varArray); + $name = $this->autoBuildVar($name); + if (!empty($varArray)) + $name = $this->tpl->parseVarFunction($name,$varArray); + else + $name = 'isset('.$name.')'; + $parseStr .= '<?php if('.$name.'): ?>'; + $endStr = '<?php endif; ?>'; + } + if($isFile) { + // 根据文件名后缀自动识别 + $type = $type?$type:(!empty($tag['type'])?strtolower($tag['type']):null); + // 文件方式导入 + $array = explode(',',$file); + foreach ($array as $val){ + if (!$type || isset($reset)) { + $type = $reset = strtolower(substr(strrchr($val, '.'),1)); + } + switch($type) { + case 'js': + $parseStr .= '<script type="text/javascript" src="'.$val.'"></script>'; + break; + case 'css': + $parseStr .= '<link rel="stylesheet" type="text/css" href="'.$val.'" />'; + break; + case 'php': + $parseStr .= '<?php require_cache("'.$val.'"); ?>'; + break; + } + } + }else{ + // 命名空间导入模式 默认是js + $type = $type?$type:(!empty($tag['type'])?strtolower($tag['type']):'js'); + $basepath = !empty($tag['basepath'])?$tag['basepath']:__ROOT__.'/Public'; + // 命名空间方式导入外部文件 + $array = explode(',',$file); + foreach ($array as $val){ + if(strpos ($val, '?')) { + list($val,$version) = explode('?',$val); + } else { + $version = ''; + } + switch($type) { + case 'js': + $parseStr .= '<script type="text/javascript" src="'.$basepath.'/'.str_replace(array('.','#'), array('/','.'),$val).'.js'.($version?'?'.$version:'').'"></script>'; + break; + case 'css': + $parseStr .= '<link rel="stylesheet" type="text/css" href="'.$basepath.'/'.str_replace(array('.','#'), array('/','.'),$val).'.css'.($version?'?'.$version:'').'" />'; + break; + case 'php': + $parseStr .= '<?php import("'.$val.'"); ?>'; + break; + } + } + } + return $parseStr.$endStr; + } + + // import别名 采用文件方式加载(要使用命名空间必须用import) 例如 <load file="__PUBLIC__/Js/Base.js" /> + public function _load($tag,$content) { + return $this->_import($tag,$content,true); + } + + // import别名使用 导入css文件 <css file="__PUBLIC__/Css/Base.css" /> + public function _css($tag,$content) { + return $this->_import($tag,$content,true,'css'); + } + + // import别名使用 导入js文件 <js file="__PUBLIC__/Js/Base.js" /> + public function _js($tag,$content) { + return $this->_import($tag,$content,true,'js'); + } + + /** + * assign标签解析 + * 在模板中给某个变量赋值 支持变量赋值 + * 格式: <assign name="" value="" /> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _assign($tag,$content) { + $name = $this->autoBuildVar($tag['name']); + if('$'==substr($tag['value'],0,1)) { + $value = $this->autoBuildVar(substr($tag['value'],1)); + }else{ + $value = '\''.$tag['value']. '\''; + } + $parseStr = '<?php '.$name.' = '.$value.'; ?>'; + return $parseStr; + } + + /** + * define标签解析 + * 在模板中定义常量 支持变量赋值 + * 格式: <define name="" value="" /> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _define($tag,$content) { + $name = '\''.$tag['name']. '\''; + if('$'==substr($tag['value'],0,1)) { + $value = $this->autoBuildVar(substr($tag['value'],1)); + }else{ + $value = '\''.$tag['value']. '\''; + } + $parseStr = '<?php define('.$name.', '.$value.'); ?>'; + return $parseStr; + } + + /** + * for标签解析 + * 格式: <for start="" end="" comparison="" step="" name="" /> + * @access public + * @param array $tag 标签属性 + * @param string $content 标签内容 + * @return string + */ + public function _for($tag, $content){ + //设置默认值 + $start = 0; + $end = 0; + $step = 1; + $comparison = 'lt'; + $name = 'i'; + $rand = rand(); //添加随机数,防止嵌套变量冲突 + //获取属性 + foreach ($tag as $key => $value){ + $value = trim($value); + if(':'==substr($value,0,1)) + $value = substr($value,1); + elseif('$'==substr($value,0,1)) + $value = $this->autoBuildVar(substr($value,1)); + switch ($key){ + case 'start': + $start = $value; break; + case 'end' : + $end = $value; break; + case 'step': + $step = $value; break; + case 'comparison': + $comparison = $value; break; + case 'name': + $name = $value; break; + } + } + + $parseStr = '<?php $__FOR_START_'.$rand.'__='.$start.';$__FOR_END_'.$rand.'__='.$end.';'; + $parseStr .= 'for($'.$name.'=$__FOR_START_'.$rand.'__;'.$this->parseCondition('$'.$name.' '.$comparison.' $__FOR_END_'.$rand.'__').';$'.$name.'+='.$step.'){ ?>'; + $parseStr .= $content; + $parseStr .= '<?php } ?>'; + return $parseStr; + } + +} diff --git a/ThinkPHP/Library/Think/Template/TagLib/Html.class.php b/ThinkPHP/Library/Think/Template/TagLib/Html.class.php new file mode 100644 index 0000000..4b39499 --- /dev/null +++ b/ThinkPHP/Library/Think/Template/TagLib/Html.class.php @@ -0,0 +1,523 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think\Template\TagLib; +use Think\Template\TagLib; +/** + * Html标签库驱动 + */ +class Html extends TagLib{ + // 标签定义 + protected $tags = array( + // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 + 'editor' => array('attr'=>'id,name,style,width,height,type','close'=>1), + 'select' => array('attr'=>'name,options,values,output,multiple,id,size,first,change,selected,dblclick','close'=>0), + 'grid' => array('attr'=>'id,pk,style,action,actionlist,show,datasource','close'=>0), + 'list' => array('attr'=>'id,pk,style,action,actionlist,show,datasource,checkbox','close'=>0), + 'imagebtn' => array('attr'=>'id,name,value,type,style,click','close'=>0), + 'checkbox' => array('attr'=>'name,checkboxes,checked,separator','close'=>0), + 'radio' => array('attr'=>'name,radios,checked,separator','close'=>0) + ); + + /** + * editor标签解析 插入可视化编辑器 + * 格式: <html:editor id="editor" name="remark" type="FCKeditor" style="" >{$vo.remark}</html:editor> + * @access public + * @param array $tag 标签属性 + * @return string|void + */ + public function _editor($tag,$content) { + $id = !empty($tag['id'])?$tag['id']: '_editor'; + $name = $tag['name']; + $style = !empty($tag['style'])?$tag['style']:''; + $width = !empty($tag['width'])?$tag['width']: '100%'; + $height = !empty($tag['height'])?$tag['height'] :'320px'; + // $content = $tag['content']; + $type = $tag['type'] ; + switch(strtoupper($type)) { + case 'FCKEDITOR': + $parseStr = '<!-- 编辑器调用开始 --><script type="text/javascript" src="__ROOT__/Public/Js/FCKeditor/fckeditor.js"></script><textarea id="'.$id.'" name="'.$name.'">'.$content.'</textarea><script type="text/javascript"> var oFCKeditor = new FCKeditor( "'.$id.'","'.$width.'","'.$height.'" ) ; oFCKeditor.BasePath = "__ROOT__/Public/Js/FCKeditor/" ; oFCKeditor.ReplaceTextarea() ;function resetEditor(){setContents("'.$id.'",document.getElementById("'.$id.'").value)}; function saveEditor(){document.getElementById("'.$id.'").value = getContents("'.$id.'");} function InsertHTML(html){ var oEditor = FCKeditorAPI.GetInstance("'.$id.'") ;if (oEditor.EditMode == FCK_EDITMODE_WYSIWYG ){oEditor.InsertHtml(html) ;}else alert( "FCK必须处于WYSIWYG模式!" ) ;}</script> <!-- 编辑器调用结束 -->'; + break; + case 'FCKMINI': + $parseStr = '<!-- 编辑器调用开始 --><script type="text/javascript" src="__ROOT__/Public/Js/FCKMini/fckeditor.js"></script><textarea id="'.$id.'" name="'.$name.'">'.$content.'</textarea><script type="text/javascript"> var oFCKeditor = new FCKeditor( "'.$id.'","'.$width.'","'.$height.'" ) ; oFCKeditor.BasePath = "__ROOT__/Public/Js/FCKMini/" ; oFCKeditor.ReplaceTextarea() ;function resetEditor(){setContents("'.$id.'",document.getElementById("'.$id.'").value)}; function saveEditor(){document.getElementById("'.$id.'").value = getContents("'.$id.'");} function InsertHTML(html){ var oEditor = FCKeditorAPI.GetInstance("'.$id.'") ;if (oEditor.EditMode == FCK_EDITMODE_WYSIWYG ){oEditor.InsertHtml(html) ;}else alert( "FCK必须处于WYSIWYG模式!" ) ;}</script> <!-- 编辑器调用结束 -->'; + break; + case 'EWEBEDITOR': + $parseStr = "<!-- 编辑器调用开始 --><script type='text/javascript' src='__ROOT__/Public/Js/eWebEditor/js/edit.js'></script><input type='hidden' id='{$id}' name='{$name}' value='{$conent}'><iframe src='__ROOT__/Public/Js/eWebEditor/ewebeditor.htm?id={$name}' frameborder=0 scrolling=no width='{$width}' height='{$height}'></iframe><script type='text/javascript'>function saveEditor(){document.getElementById('{$id}').value = getHTML();} </script><!-- 编辑器调用结束 -->"; + break; + case 'NETEASE': + $parseStr = '<!-- 编辑器调用开始 --><textarea id="'.$id.'" name="'.$name.'" style="display:none">'.$content.'</textarea><iframe ID="Editor" name="Editor" src="__ROOT__/Public/Js/HtmlEditor/index.html?ID='.$name.'" frameBorder="0" marginHeight="0" marginWidth="0" scrolling="No" style="height:'.$height.';width:'.$width.'"></iframe><!-- 编辑器调用结束 -->'; + break; + case 'UBB': + $parseStr = '<script type="text/javascript" src="__ROOT__/Public/Js/UbbEditor.js"></script><div style="padding:1px;width:'.$width.';border:1px solid silver;float:left;"><script LANGUAGE="JavaScript"> showTool(); </script></div><div><TEXTAREA id="UBBEditor" name="'.$name.'" style="clear:both;float:none;width:'.$width.';height:'.$height.'" >'.$content.'</TEXTAREA></div><div style="padding:1px;width:'.$width.';border:1px solid silver;float:left;"><script LANGUAGE="JavaScript">showEmot(); </script></div>'; + break; + case 'KINDEDITOR': + $parseStr = '<script type="text/javascript" src="__ROOT__/Public/Js/KindEditor/kindeditor.js"></script><script type="text/javascript"> KE.show({ id : \''.$id.'\' ,urlType : "absolute"});</script><textarea id="'.$id.'" style="'.$style.'" name="'.$name.'" >'.$content.'</textarea>'; + break; + default : + $parseStr = '<textarea id="'.$id.'" style="'.$style.'" name="'.$name.'" >'.$content.'</textarea>'; + } + + return $parseStr; + } + + /** + * imageBtn标签解析 + * 格式: <html:imageBtn type="" value="" /> + * @access public + * @param array $tag 标签属性 + * @return string|void + */ + public function _imageBtn($tag) { + $name = $tag['name']; //名称 + $value = $tag['value']; //文字 + $id = isset($tag['id'])?$tag['id']:''; //ID + $style = isset($tag['style'])?$tag['style']:''; //样式名 + $click = isset($tag['click'])?$tag['click']:''; //点击 + $type = empty($tag['type'])?'button':$tag['type']; //按钮类型 + + if(!empty($name)) { + $parseStr = '<div class="'.$style.'" ><input type="'.$type.'" id="'.$id.'" name="'.$name.'" value="'.$value.'" onclick="'.$click.'" class="'.$name.' imgButton"></div>'; + }else { + $parseStr = '<div class="'.$style.'" ><input type="'.$type.'" id="'.$id.'" name="'.$name.'" value="'.$value.'" onclick="'.$click.'" class="button"></div>'; + } + + return $parseStr; + } + + /** + * imageLink标签解析 + * 格式: <html:imageLink type="" value="" /> + * @access public + * @param array $tag 标签属性 + * @return string|void + */ + public function _imgLink($tag) { + $name = $tag['name']; //名称 + $alt = $tag['alt']; //文字 + $id = $tag['id']; //ID + $style = $tag['style']; //样式名 + $click = $tag['click']; //点击 + $type = $tag['type']; //点击 + if(empty($type)) { + $type = 'button'; + } + $parseStr = '<span class="'.$style.'" ><input title="'.$alt.'" type="'.$type.'" id="'.$id.'" name="'.$name.'" onmouseover="this.style.filter=\'alpha(opacity=100)\'" onmouseout="this.style.filter=\'alpha(opacity=80)\'" onclick="'.$click.'" align="absmiddle" class="'.$name.' imgLink"></span>'; + + return $parseStr; + } + + /** + * select标签解析 + * 格式: <html:select options="name" selected="value" /> + * @access public + * @param array $tag 标签属性 + * @return string|void + */ + public function _select($tag) { + $name = $tag['name']; + $options = $tag['options']; + $values = $tag['values']; + $output = $tag['output']; + $multiple = $tag['multiple']; + $id = $tag['id']; + $size = $tag['size']; + $first = $tag['first']; + $selected = $tag['selected']; + $style = $tag['style']; + $ondblclick = $tag['dblclick']; + $onchange = $tag['change']; + + if(!empty($multiple)) { + $parseStr = '<select id="'.$id.'" name="'.$name.'" ondblclick="'.$ondblclick.'" onchange="'.$onchange.'" multiple="multiple" class="'.$style.'" size="'.$size.'" >'; + }else { + $parseStr = '<select id="'.$id.'" name="'.$name.'" onchange="'.$onchange.'" ondblclick="'.$ondblclick.'" class="'.$style.'" >'; + } + if(!empty($first)) { + $parseStr .= '<option value="" >'.$first.'</option>'; + } + if(!empty($options)) { + $parseStr .= '<?php foreach($'.$options.' as $key=>$val) { ?>'; + if(!empty($selected)) { + $parseStr .= '<?php if(!empty($'.$selected.') && ($'.$selected.' == $key || in_array($key,$'.$selected.'))) { ?>'; + $parseStr .= '<option selected="selected" value="<?php echo $key ?>"><?php echo $val ?></option>'; + $parseStr .= '<?php }else { ?><option value="<?php echo $key ?>"><?php echo $val ?></option>'; + $parseStr .= '<?php } ?>'; + }else { + $parseStr .= '<option value="<?php echo $key ?>"><?php echo $val ?></option>'; + } + $parseStr .= '<?php } ?>'; + }else if(!empty($values)) { + $parseStr .= '<?php for($i=0;$i<count($'.$values.');$i++) { ?>'; + if(!empty($selected)) { + $parseStr .= '<?php if(isset($'.$selected.') && ((is_string($'.$selected.') && $'.$selected.' == $'.$values.'[$i]) || (is_array($'.$selected.') && in_array($'.$values.'[$i],$'.$selected.')))) { ?>'; + $parseStr .= '<option selected="selected" value="<?php echo $'.$values.'[$i] ?>"><?php echo $'.$output.'[$i] ?></option>'; + $parseStr .= '<?php }else { ?><option value="<?php echo $'.$values.'[$i] ?>"><?php echo $'.$output.'[$i] ?></option>'; + $parseStr .= '<?php } ?>'; + }else { + $parseStr .= '<option value="<?php echo $'.$values.'[$i] ?>"><?php echo $'.$output.'[$i] ?></option>'; + } + $parseStr .= '<?php } ?>'; + } + $parseStr .= '</select>'; + return $parseStr; + } + + /** + * checkbox标签解析 + * 格式: <html:checkbox checkboxes="" checked="" /> + * @access public + * @param array $tag 标签属性 + * @return string|void + */ + public function _checkbox($tag) { + $name = $tag['name']; + $checkboxes = $tag['checkboxes']; + $checked = $tag['checked']; + $separator = $tag['separator']; + $checkboxes = $this->tpl->get($checkboxes); + $checked = $this->tpl->get($checked)?$this->tpl->get($checked):$checked; + $parseStr = ''; + foreach($checkboxes as $key=>$val) { + if($checked == $key || in_array($key,$checked) ) { + $parseStr .= '<input type="checkbox" checked="checked" name="'.$name.'[]" value="'.$key.'">'.$val.$separator; + }else { + $parseStr .= '<input type="checkbox" name="'.$name.'[]" value="'.$key.'">'.$val.$separator; + } + } + return $parseStr; + } + + /** + * radio标签解析 + * 格式: <html:radio radios="name" checked="value" /> + * @access public + * @param array $tag 标签属性 + * @return string|void + */ + public function _radio($tag) { + $name = $tag['name']; + $radios = $tag['radios']; + $checked = $tag['checked']; + $separator = $tag['separator']; + $radios = $this->tpl->get($radios); + $checked = $this->tpl->get($checked)?$this->tpl->get($checked):$checked; + $parseStr = ''; + foreach($radios as $key=>$val) { + if($checked == $key ) { + $parseStr .= '<input type="radio" checked="checked" name="'.$name.'[]" value="'.$key.'">'.$val.$separator; + }else { + $parseStr .= '<input type="radio" name="'.$name.'[]" value="'.$key.'">'.$val.$separator; + } + + } + return $parseStr; + } + + /** + * list标签解析 + * 格式: <html:grid datasource="" show="vo" /> + * @access public + * @param array $tag 标签属性 + * @return string + */ + public function _grid($tag) { + $id = $tag['id']; //表格ID + $datasource = $tag['datasource']; //列表显示的数据源VoList名称 + $pk = empty($tag['pk'])?'id':$tag['pk'];//主键名,默认为id + $style = $tag['style']; //样式名 + $name = !empty($tag['name'])?$tag['name']:'vo'; //Vo对象名 + $action = !empty($tag['action'])?$tag['action']:false; //是否显示功能操作 + $key = !empty($tag['key'])?true:false; + if(isset($tag['actionlist'])) { + $actionlist = explode(',',trim($tag['actionlist'])); //指定功能列表 + } + + if(substr($tag['show'],0,1)=='$') { + $show = $this->tpl->get(substr($tag['show'],1)); + }else { + $show = $tag['show']; + } + $show = explode(',',$show); //列表显示字段列表 + + //计算表格的列数 + $colNum = count($show); + if(!empty($action)) $colNum++; + if(!empty($key)) $colNum++; + + //显示开始 + $parseStr = "<!-- Think 系统列表组件开始 -->\n"; + $parseStr .= '<table id="'.$id.'" class="'.$style.'" cellpadding=0 cellspacing=0 >'; + $parseStr .= '<tr><td height="5" colspan="'.$colNum.'" class="topTd" ></td></tr>'; + $parseStr .= '<tr class="row" >'; + //列表需要显示的字段 + $fields = array(); + foreach($show as $val) { + $fields[] = explode(':',$val); + } + + if(!empty($key)) { + $parseStr .= '<th width="12">No</th>'; + } + foreach($fields as $field) {//显示指定的字段 + $property = explode('|',$field[0]); + $showname = explode('|',$field[1]); + if(isset($showname[1])) { + $parseStr .= '<th width="'.$showname[1].'">'; + }else { + $parseStr .= '<th>'; + } + $parseStr .= $showname[0].'</th>'; + } + if(!empty($action)) {//如果指定显示操作功能列 + $parseStr .= '<th >操作</th>'; + } + $parseStr .= '</tr>'; + $parseStr .= '<volist name="'.$datasource.'" id="'.$name.'" ><tr class="row" >'; //支持鼠标移动单元行颜色变化 具体方法在js中定义 + + if(!empty($key)) { + $parseStr .= '<td>{$i}</td>'; + } + foreach($fields as $field) { + //显示定义的列表字段 + $parseStr .= '<td>'; + if(!empty($field[2])) { + // 支持列表字段链接功能 具体方法由JS函数实现 + $href = explode('|',$field[2]); + if(count($href)>1) { + //指定链接传的字段值 + // 支持多个字段传递 + $array = explode('^',$href[1]); + if(count($array)>1) { + foreach ($array as $a){ + $temp[] = '\'{$'.$name.'.'.$a.'|addslashes}\''; + } + $parseStr .= '<a href="javascript:'.$href[0].'('.implode(',',$temp).')">'; + }else{ + $parseStr .= '<a href="javascript:'.$href[0].'(\'{$'.$name.'.'.$href[1].'|addslashes}\')">'; + } + }else { + //如果没有指定默认传编号值 + $parseStr .= '<a href="javascript:'.$field[2].'(\'{$'.$name.'.'.$pk.'|addslashes}\')">'; + } + } + if(strpos($field[0],'^')) { + $property = explode('^',$field[0]); + foreach ($property as $p){ + $unit = explode('|',$p); + if(count($unit)>1) { + $parseStr .= '{$'.$name.'.'.$unit[0].'|'.$unit[1].'} '; + }else { + $parseStr .= '{$'.$name.'.'.$p.'} '; + } + } + }else{ + $property = explode('|',$field[0]); + if(count($property)>1) { + $parseStr .= '{$'.$name.'.'.$property[0].'|'.$property[1].'}'; + }else { + $parseStr .= '{$'.$name.'.'.$field[0].'}'; + } + } + if(!empty($field[2])) { + $parseStr .= '</a>'; + } + $parseStr .= '</td>'; + + } + if(!empty($action)) {//显示功能操作 + if(!empty($actionlist[0])) {//显示指定的功能项 + $parseStr .= '<td>'; + foreach($actionlist as $val) { + if(strpos($val,':')) { + $a = explode(':',$val); + if(count($a)>2) { + $parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$a[2].'}\')">'.$a[1].'</a> '; + }else { + $parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$pk.'}\')">'.$a[1].'</a> '; + } + }else{ + $array = explode('|',$val); + if(count($array)>2) { + $parseStr .= ' <a href="javascript:'.$array[1].'(\'{$'.$name.'.'.$array[0].'}\')">'.$array[2].'</a> '; + }else{ + $parseStr .= ' {$'.$name.'.'.$val.'} '; + } + } + } + $parseStr .= '</td>'; + } + } + $parseStr .= '</tr></volist><tr><td height="5" colspan="'.$colNum.'" class="bottomTd"></td></tr></table>'; + $parseStr .= "\n<!-- Think 系统列表组件结束 -->\n"; + return $parseStr; + } + + /** + * list标签解析 + * 格式: <html:list datasource="" show="" /> + * @access public + * @param array $tag 标签属性 + * @return string + */ + public function _list($tag) { + $id = $tag['id']; //表格ID + $datasource = $tag['datasource']; //列表显示的数据源VoList名称 + $pk = empty($tag['pk'])?'id':$tag['pk'];//主键名,默认为id + $style = $tag['style']; //样式名 + $name = !empty($tag['name'])?$tag['name']:'vo'; //Vo对象名 + $action = $tag['action']=='true'?true:false; //是否显示功能操作 + $key = !empty($tag['key'])?true:false; + $sort = $tag['sort']=='false'?false:true; + $checkbox = $tag['checkbox']; //是否显示Checkbox + if(isset($tag['actionlist'])) { + if(substr($tag['actionlist'],0,1)=='$') { + $actionlist = $this->tpl->get(substr($tag['actionlist'],1)); + }else { + $actionlist = $tag['actionlist']; + } + $actionlist = explode(',',trim($actionlist)); //指定功能列表 + } + + if(substr($tag['show'],0,1)=='$') { + $show = $this->tpl->get(substr($tag['show'],1)); + }else { + $show = $tag['show']; + } + $show = explode(',',$show); //列表显示字段列表 + + //计算表格的列数 + $colNum = count($show); + if(!empty($checkbox)) $colNum++; + if(!empty($action)) $colNum++; + if(!empty($key)) $colNum++; + + //显示开始 + $parseStr = "<!-- Think 系统列表组件开始 -->\n"; + $parseStr .= '<table id="'.$id.'" class="'.$style.'" cellpadding=0 cellspacing=0 >'; + $parseStr .= '<tr><td height="5" colspan="'.$colNum.'" class="topTd" ></td></tr>'; + $parseStr .= '<tr class="row" >'; + //列表需要显示的字段 + $fields = array(); + foreach($show as $val) { + $fields[] = explode(':',$val); + } + if(!empty($checkbox) && 'true'==strtolower($checkbox)) {//如果指定需要显示checkbox列 + $parseStr .='<th width="8"><input type="checkbox" id="check" onclick="CheckAll(\''.$id.'\')"></th>'; + } + if(!empty($key)) { + $parseStr .= '<th width="12">No</th>'; + } + foreach($fields as $field) {//显示指定的字段 + $property = explode('|',$field[0]); + $showname = explode('|',$field[1]); + if(isset($showname[1])) { + $parseStr .= '<th width="'.$showname[1].'">'; + }else { + $parseStr .= '<th>'; + } + $showname[2] = isset($showname[2])?$showname[2]:$showname[0]; + if($sort) { + $parseStr .= '<a href="javascript:sortBy(\''.$property[0].'\',\'{$sort}\',\''.ACTION_NAME.'\')" title="按照'.$showname[2].'{$sortType} ">'.$showname[0].'<eq name="order" value="'.$property[0].'" ><img src="__PUBLIC__/images/{$sortImg}.gif" width="12" height="17" border="0" align="absmiddle"></eq></a></th>'; + }else{ + $parseStr .= $showname[0].'</th>'; + } + + } + if(!empty($action)) {//如果指定显示操作功能列 + $parseStr .= '<th >操作</th>'; + } + + $parseStr .= '</tr>'; + $parseStr .= '<volist name="'.$datasource.'" id="'.$name.'" ><tr class="row" '; //支持鼠标移动单元行颜色变化 具体方法在js中定义 + if(!empty($checkbox)) { + // $parseStr .= 'onmouseover="over(event)" onmouseout="out(event)" onclick="change(event)" '; + } + $parseStr .= '>'; + if(!empty($checkbox)) {//如果需要显示checkbox 则在每行开头显示checkbox + $parseStr .= '<td><input type="checkbox" name="key" value="{$'.$name.'.'.$pk.'}"></td>'; + } + if(!empty($key)) { + $parseStr .= '<td>{$i}</td>'; + } + foreach($fields as $field) { + //显示定义的列表字段 + $parseStr .= '<td>'; + if(!empty($field[2])) { + // 支持列表字段链接功能 具体方法由JS函数实现 + $href = explode('|',$field[2]); + if(count($href)>1) { + //指定链接传的字段值 + // 支持多个字段传递 + $array = explode('^',$href[1]); + if(count($array)>1) { + foreach ($array as $a){ + $temp[] = '\'{$'.$name.'.'.$a.'|addslashes}\''; + } + $parseStr .= '<a href="javascript:'.$href[0].'('.implode(',',$temp).')">'; + }else{ + $parseStr .= '<a href="javascript:'.$href[0].'(\'{$'.$name.'.'.$href[1].'|addslashes}\')">'; + } + }else { + //如果没有指定默认传编号值 + $parseStr .= '<a href="javascript:'.$field[2].'(\'{$'.$name.'.'.$pk.'|addslashes}\')">'; + } + } + if(strpos($field[0],'^')) { + $property = explode('^',$field[0]); + foreach ($property as $p){ + $unit = explode('|',$p); + if(count($unit)>1) { + $parseStr .= '{$'.$name.'.'.$unit[0].'|'.$unit[1].'} '; + }else { + $parseStr .= '{$'.$name.'.'.$p.'} '; + } + } + }else{ + $property = explode('|',$field[0]); + if(count($property)>1) { + $parseStr .= '{$'.$name.'.'.$property[0].'|'.$property[1].'}'; + }else { + $parseStr .= '{$'.$name.'.'.$field[0].'}'; + } + } + if(!empty($field[2])) { + $parseStr .= '</a>'; + } + $parseStr .= '</td>'; + + } + if(!empty($action)) {//显示功能操作 + if(!empty($actionlist[0])) {//显示指定的功能项 + $parseStr .= '<td>'; + foreach($actionlist as $val) { + if(strpos($val,':')) { + $a = explode(':',$val); + if(count($a)>2) { + $parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$a[2].'}\')">'.$a[1].'</a> '; + }else { + $parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$pk.'}\')">'.$a[1].'</a> '; + } + }else{ + $array = explode('|',$val); + if(count($array)>2) { + $parseStr .= ' <a href="javascript:'.$array[1].'(\'{$'.$name.'.'.$array[0].'}\')">'.$array[2].'</a> '; + }else{ + $parseStr .= ' {$'.$name.'.'.$val.'} '; + } + } + } + $parseStr .= '</td>'; + } + } + $parseStr .= '</tr></volist><tr><td height="5" colspan="'.$colNum.'" class="bottomTd"></td></tr></table>'; + $parseStr .= "\n<!-- Think 系统列表组件结束 -->\n"; + return $parseStr; + } +} \ No newline at end of file diff --git a/ThinkPHP/Library/Think/Think.class.php b/ThinkPHP/Library/Think/Think.class.php new file mode 100644 index 0000000..3bd1864 --- /dev/null +++ b/ThinkPHP/Library/Think/Think.class.php @@ -0,0 +1,344 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +namespace Think; +/** + * ThinkPHP 引导类 + */ +class Think { + + // 类映射 + private static $_map = array(); + + // 实例化对象 + private static $_instance = array(); + + /** + * 应用程序初始化 + * @access public + * @return void + */ + static public function start() { + // 注册AUTOLOAD方法 + spl_autoload_register('Think\Think::autoload'); + // 设定错误和异常处理 + register_shutdown_function('Think\Think::fatalError'); + set_error_handler('Think\Think::appError'); + set_exception_handler('Think\Think::appException'); + + // 初始化文件存储方式 + Storage::connect(STORAGE_TYPE); + + $runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php'; + if(!APP_DEBUG && Storage::has($runtimefile)){ + Storage::load($runtimefile); + }else{ + if(Storage::has($runtimefile)) + Storage::unlink($runtimefile); + $content = ''; + // 读取应用模式 + $mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php'; + // 加载核心文件 + foreach ($mode['core'] as $file){ + if(is_file($file)) { + include $file; + if(!APP_DEBUG) $content .= compile($file); + } + } + + // 加载应用模式配置文件 + foreach ($mode['config'] as $key=>$file){ + is_numeric($key)?C(load_config($file)):C($key,load_config($file)); + } + + // 读取当前应用模式对应的配置文件 + if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.CONF_EXT)) + C(load_config(CONF_PATH.'config_'.APP_MODE.CONF_EXT)); + + // 加载模式别名定义 + if(isset($mode['alias'])){ + self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']); + } + + // 加载应用别名定义文件 + if(is_file(CONF_PATH.'alias.php')) + self::addMap(include CONF_PATH.'alias.php'); + + // 加载模式行为定义 + if(isset($mode['tags'])) { + Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']); + } + + // 加载应用行为定义 + if(is_file(CONF_PATH.'tags.php')) + // 允许应用增加开发模式配置定义 + Hook::import(include CONF_PATH.'tags.php'); + + // 加载框架底层语言包 + L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php'); + + if(!APP_DEBUG){ + $content .= "\nnamespace { Think\\Think::addMap(".var_export(self::$_map,true).");"; + $content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(Hook::get(),true).');}'; + Storage::put($runtimefile,strip_whitespace('<?php '.$content)); + }else{ + // 调试模式加载系统默认的配置文件 + C(include THINK_PATH.'Conf/debug.php'); + // 读取应用调试配置文件 + if(is_file(CONF_PATH.'debug'.CONF_EXT)) + C(include CONF_PATH.'debug'.CONF_EXT); + } + } + + // 读取当前应用状态对应的配置文件 + if(APP_STATUS && is_file(CONF_PATH.APP_STATUS.CONF_EXT)) + C(include CONF_PATH.APP_STATUS.CONF_EXT); + + // 设置系统时区 + date_default_timezone_set(C('DEFAULT_TIMEZONE')); + + // 检查应用目录结构 如果不存在则自动创建 + if(C('CHECK_APP_DIR')) { + $module = defined('BIND_MODULE') ? BIND_MODULE : C('DEFAULT_MODULE'); + if(!is_dir(APP_PATH.$module) || !is_dir(LOG_PATH)){ + // 检测应用目录结构 + Build::checkDir($module); + } + } + + // 记录加载文件时间 + G('loadTime'); + // 运行应用 + App::run(); + } + + // 注册classmap + static public function addMap($class, $map=''){ + if(is_array($class)){ + self::$_map = array_merge(self::$_map, $class); + }else{ + self::$_map[$class] = $map; + } + } + + // 获取classmap + static public function getMap($class=''){ + if(''===$class){ + return self::$_map; + }elseif(isset(self::$_map[$class])){ + return self::$_map[$class]; + }else{ + return null; + } + } + + /** + * 类库自动加载 + * @param string $class 对象类名 + * @return void + */ + public static function autoload($class) { + // 检查是否存在映射 + if(isset(self::$_map[$class])) { + include self::$_map[$class]; + }elseif(false !== strpos($class,'\\')){ + $name = strstr($class, '\\', true); + if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){ + // Library目录下面的命名空间自动定位 + $path = LIB_PATH; + }else{ + // 检测自定义命名空间 否则就以模块为命名空间 + $namespace = C('AUTOLOAD_NAMESPACE'); + $path = isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH; + } + $filename = $path . str_replace('\\', '/', $class) . EXT; + if(is_file($filename)) { + // Win环境下面严格区分大小写 + if (IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)){ + return ; + } + include $filename; + } + }elseif (!C('APP_USE_NAMESPACE')) { + // 自动加载的类库层 + foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){ + if(substr($class,-strlen($layer))==$layer){ + if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) { + return ; + } + } + } + // 根据自动加载路径设置进行尝试搜索 + foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){ + if(import($path.'.'.$class)) + // 如果加载类成功则返回 + return ; + } + } + } + + /** + * 取得对象实例 支持调用类的静态方法 + * @param string $class 对象类名 + * @param string $method 类的静态方法名 + * @return object + */ + static public function instance($class,$method='') { + $identify = $class.$method; + if(!isset(self::$_instance[$identify])) { + if(class_exists($class)){ + $o = new $class(); + if(!empty($method) && method_exists($o,$method)) + self::$_instance[$identify] = call_user_func(array(&$o, $method)); + else + self::$_instance[$identify] = $o; + } + else + self::halt(L('_CLASS_NOT_EXIST_').':'.$class); + } + return self::$_instance[$identify]; + } + + /** + * 自定义异常处理 + * @access public + * @param mixed $e 异常对象 + */ + static public function appException($e) { + $error = array(); + $error['message'] = $e->getMessage(); + $trace = $e->getTrace(); + if('E'==$trace[0]['function']) { + $error['file'] = $trace[0]['file']; + $error['line'] = $trace[0]['line']; + }else{ + $error['file'] = $e->getFile(); + $error['line'] = $e->getLine(); + } + $error['trace'] = $e->getTraceAsString(); + Log::record($error['message'],Log::ERR); + // 发送404信息 + header('HTTP/1.1 404 Not Found'); + header('Status:404 Not Found'); + self::halt($error); + } + + /** + * 自定义错误处理 + * @access public + * @param int $errno 错误类型 + * @param string $errstr 错误信息 + * @param string $errfile 错误文件 + * @param int $errline 错误行数 + * @return void + */ + static public function appError($errno, $errstr, $errfile, $errline) { + switch ($errno) { + case E_ERROR: + case E_PARSE: + case E_CORE_ERROR: + case E_COMPILE_ERROR: + case E_USER_ERROR: + ob_end_clean(); + $errorStr = "$errstr ".$errfile." 第 $errline 行."; + if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR); + self::halt($errorStr); + break; + default: + $errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行."; + self::trace($errorStr,'','NOTIC'); + break; + } + } + + // 致命错误捕获 + static public function fatalError() { + Log::save(); + if ($e = error_get_last()) { + switch($e['type']){ + case E_ERROR: + case E_PARSE: + case E_CORE_ERROR: + case E_COMPILE_ERROR: + case E_USER_ERROR: + ob_end_clean(); + self::halt($e); + break; + } + } + } + + /** + * 错误输出 + * @param mixed $error 错误 + * @return void + */ + static public function halt($error) { + $e = array(); + if (APP_DEBUG || IS_CLI) { + //调试模式下输出错误信息 + if (!is_array($error)) { + $trace = debug_backtrace(); + $e['message'] = $error; + $e['file'] = $trace[0]['file']; + $e['line'] = $trace[0]['line']; + ob_start(); + debug_print_backtrace(); + $e['trace'] = ob_get_clean(); + } else { + $e = $error; + } + if(IS_CLI){ + exit(iconv('UTF-8','gbk',$e['message']).PHP_EOL.'FILE: '.$e['file'].'('.$e['line'].')'.PHP_EOL.$e['trace']); + } + } else { + //否则定向到错误页面 + $error_page = C('ERROR_PAGE'); + if (!empty($error_page)) { + redirect($error_page); + } else { + $message = is_array($error) ? $error['message'] : $error; + $e['message'] = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE'); + } + } + // 包含异常页面模板 + $exceptionFile = C('TMPL_EXCEPTION_FILE',null,THINK_PATH.'Tpl/think_exception.tpl'); + include $exceptionFile; + exit; + } + + /** + * 添加和获取页面Trace记录 + * @param string $value 变量 + * @param string $label 标签 + * @param string $level 日志级别(或者页面Trace的选项卡) + * @param boolean $record 是否记录日志 + * @return void|array + */ + static public function trace($value='[think]',$label='',$level='DEBUG',$record=false) { + static $_trace = array(); + if('[think]' === $value){ // 获取trace信息 + return $_trace; + }else{ + $info = ($label?$label.':':'').print_r($value,true); + $level = strtoupper($level); + + if((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE') || $record) { + Log::record($info,$level,$record); + }else{ + if(!isset($_trace[$level]) || count($_trace[$level])>C('TRACE_MAX_RECORD')) { + $_trace[$level] = array(); + } + $_trace[$level][] = $info; + } + } + } +} diff --git a/ThinkPHP/Library/Think/View.class.php b/ThinkPHP/Library/Think/View.class.php new file mode 100644 index 0000000..cbd6aaf --- /dev/null +++ b/ThinkPHP/Library/Think/View.class.php @@ -0,0 +1,229 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- +namespace Think; +/** + * ThinkPHP 视图类 + */ +class View { + /** + * 模板输出变量 + * @var tVar + * @access protected + */ + protected $tVar = array(); + + /** + * 模板主题 + * @var theme + * @access protected + */ + protected $theme = ''; + + /** + * 模板变量赋值 + * @access public + * @param mixed $name + * @param mixed $value + */ + public function assign($name,$value=''){ + if(is_array($name)) { + $this->tVar = array_merge($this->tVar,$name); + }else { + $this->tVar[$name] = $value; + } + } + + /** + * 取得模板变量的值 + * @access public + * @param string $name + * @return mixed + */ + public function get($name=''){ + if('' === $name) { + return $this->tVar; + } + return isset($this->tVar[$name])?$this->tVar[$name]:false; + } + + /** + * 加载模板和页面输出 可以返回输出内容 + * @access public + * @param string $templateFile 模板文件名 + * @param string $charset 模板输出字符集 + * @param string $contentType 输出类型 + * @param string $content 模板输出内容 + * @param string $prefix 模板缓存前缀 + * @return mixed + */ + public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { + G('viewStartTime'); + // 视图开始标签 + Hook::listen('view_begin',$templateFile); + // 解析并获取模板内容 + $content = $this->fetch($templateFile,$content,$prefix); + // 输出模板内容 + $this->render($content,$charset,$contentType); + // 视图结束标签 + Hook::listen('view_end'); + } + + /** + * 输出内容文本可以包括Html + * @access private + * @param string $content 输出内容 + * @param string $charset 模板输出字符集 + * @param string $contentType 输出类型 + * @return mixed + */ + private function render($content,$charset='',$contentType=''){ + if(empty($charset)) $charset = C('DEFAULT_CHARSET'); + if(empty($contentType)) $contentType = C('TMPL_CONTENT_TYPE'); + // 网页字符编码 + header('Content-Type:'.$contentType.'; charset='.$charset); + header('Cache-control: '.C('HTTP_CACHE_CONTROL')); // 页面缓存控制 + header('X-Powered-By:ThinkPHP'); + // 输出模板文件 + echo $content; + } + + /** + * 解析和获取模板内容 用于输出 + * @access public + * @param string $templateFile 模板文件名 + * @param string $content 模板输出内容 + * @param string $prefix 模板缓存前缀 + * @return string + */ + public function fetch($templateFile='',$content='',$prefix='') { + if(empty($content)) { + $templateFile = $this->parseTemplate($templateFile); + // 模板文件不存在直接返回 + if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile); + }else{ + defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath()); + } + // 页面缓存 + ob_start(); + ob_implicit_flush(0); + if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板 + $_content = $content; + // 模板阵列变量分解成为独立变量 + extract($this->tVar, EXTR_OVERWRITE); + // 直接载入PHP模板 + empty($_content)?include $templateFile:eval('?>'.$_content); + }else{ + // 视图解析标签 + $params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix); + Hook::listen('view_parse',$params); + } + // 获取并清空缓存 + $content = ob_get_clean(); + // 内容过滤标签 + Hook::listen('view_filter',$content); + // 输出模板文件 + return $content; + } + + /** + * 自动定位模板文件 + * @access protected + * @param string $template 模板文件规则 + * @return string + */ + public function parseTemplate($template='') { + if(is_file($template)) { + return $template; + } + $depr = C('TMPL_FILE_DEPR'); + $template = str_replace(':', $depr, $template); + + // 获取当前模块 + $module = MODULE_NAME; + if(strpos($template,'@')){ // 跨模块调用模版文件 + list($module,$template) = explode('@',$template); + } + // 获取当前主题的模版路径 + defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath($module)); + + // 分析模板文件规则 + if('' == $template) { + // 如果模板文件名为空 按照默认规则定位 + $template = CONTROLLER_NAME . $depr . ACTION_NAME; + }elseif(false === strpos($template, $depr)){ + $template = CONTROLLER_NAME . $depr . $template; + } + $file = THEME_PATH.$template.C('TMPL_TEMPLATE_SUFFIX'); + if(C('TMPL_LOAD_DEFAULTTHEME') && THEME_NAME != C('DEFAULT_THEME') && !is_file($file)){ + // 找不到当前主题模板的时候定位默认主题中的模板 + $file = dirname(THEME_PATH).'/'.C('DEFAULT_THEME').'/'.$template.C('TMPL_TEMPLATE_SUFFIX'); + } + return $file; + } + + /** + * 获取当前的模板路径 + * @access protected + * @param string $module 模块名 + * @return string + */ + protected function getThemePath($module=MODULE_NAME){ + // 获取当前主题名称 + $theme = $this->getTemplateTheme(); + // 获取当前主题的模版路径 + $tmplPath = C('VIEW_PATH'); // 模块设置独立的视图目录 + if(!$tmplPath){ + // 定义TMPL_PATH 则改变全局的视图目录到模块之外 + $tmplPath = defined('TMPL_PATH')? TMPL_PATH.$module.'/' : APP_PATH.$module.'/'.C('DEFAULT_V_LAYER').'/'; + } + return $tmplPath.$theme; + } + + /** + * 设置当前输出的模板主题 + * @access public + * @param mixed $theme 主题名称 + * @return View + */ + public function theme($theme){ + $this->theme = $theme; + return $this; + } + + /** + * 获取当前的模板主题 + * @access private + * @return string + */ + private function getTemplateTheme() { + if($this->theme) { // 指定模板主题 + $theme = $this->theme; + }else{ + /* 获取模板主题名称 */ + $theme = C('DEFAULT_THEME'); + if(C('TMPL_DETECT_THEME')) {// 自动侦测模板主题 + $t = C('VAR_TEMPLATE'); + if (isset($_GET[$t])){ + $theme = $_GET[$t]; + }elseif(cookie('think_template')){ + $theme = cookie('think_template'); + } + if(!in_array($theme,explode(',',C('THEME_LIST')))){ + $theme = C('DEFAULT_THEME'); + } + cookie('think_template',$theme,864000); + } + } + defined('THEME_NAME') || define('THEME_NAME', $theme); // 当前模板主题名称 + return $theme?$theme . '/':''; + } + +} \ No newline at end of file diff --git a/ThinkPHP/Library/Vendor/README.txt b/ThinkPHP/Library/Vendor/README.txt new file mode 100644 index 0000000..88cafc0 --- /dev/null +++ b/ThinkPHP/Library/Vendor/README.txt @@ -0,0 +1 @@ +第三方类库包目录 \ No newline at end of file diff --git a/ThinkPHP/Mode/common.php b/ThinkPHP/Mode/common.php new file mode 100644 index 0000000..5513773 --- /dev/null +++ b/ThinkPHP/Mode/common.php @@ -0,0 +1,71 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +/** + * ThinkPHP 普通模式定义 + */ +return array( + // 配置文件 + 'config' => array( + THINK_PATH.'Conf/convention.php', // 系统惯例配置 + CONF_PATH.'config'.CONF_EXT, // 应用公共配置 + ), + + // 别名定义 + 'alias' => array( + 'Think\Log' => CORE_PATH . 'Log'.EXT, + 'Think\Log\Driver\File' => CORE_PATH . 'Log/Driver/File'.EXT, + 'Think\Exception' => CORE_PATH . 'Exception'.EXT, + 'Think\Model' => CORE_PATH . 'Model'.EXT, + 'Think\Db' => CORE_PATH . 'Db'.EXT, + 'Think\Template' => CORE_PATH . 'Template'.EXT, + 'Think\Cache' => CORE_PATH . 'Cache'.EXT, + 'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT, + 'Think\Storage' => CORE_PATH . 'Storage'.EXT, + ), + + // 函数和类文件 + 'core' => array( + THINK_PATH.'Common/functions.php', + COMMON_PATH.'Common/function.php', + CORE_PATH . 'Hook'.EXT, + CORE_PATH . 'App'.EXT, + CORE_PATH . 'Dispatcher'.EXT, + //CORE_PATH . 'Log'.EXT, + CORE_PATH . 'Route'.EXT, + CORE_PATH . 'Controller'.EXT, + CORE_PATH . 'View'.EXT, + BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT, + BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT, + BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT, + ), + // 行为扩展定义 + 'tags' => array( + 'app_init' => array( + 'Behavior\BuildLiteBehavior', // 生成运行Lite文件 + ), + 'app_begin' => array( + 'Behavior\ReadHtmlCacheBehavior', // 读取静态缓存 + ), + 'app_end' => array( + 'Behavior\ShowPageTraceBehavior', // 页面Trace显示 + ), + 'view_parse' => array( + 'Behavior\ParseTemplateBehavior', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎 + ), + 'template_filter'=> array( + 'Behavior\ContentReplaceBehavior', // 模板输出替换 + ), + 'view_filter' => array( + 'Behavior\WriteHtmlCacheBehavior', // 写入静态缓存 + ), + ), +); diff --git a/ThinkPHP/ThinkPHP.php b/ThinkPHP/ThinkPHP.php new file mode 100644 index 0000000..16970a7 --- /dev/null +++ b/ThinkPHP/ThinkPHP.php @@ -0,0 +1,97 @@ +<?php +// +---------------------------------------------------------------------- +// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// +---------------------------------------------------------------------- +// | Author: liu21st <liu21st@gmail.com> +// +---------------------------------------------------------------------- + +//---------------------------------- +// ThinkPHP公共入口文件 +//---------------------------------- + +// 记录开始运行时间 +$GLOBALS['_beginTime'] = microtime(TRUE); +// 记录内存初始使用 +define('MEMORY_LIMIT_ON',function_exists('memory_get_usage')); +if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage(); + +// 版本信息 +const THINK_VERSION = '3.2.3'; + +// URL 模式定义 +const URL_COMMON = 0; //普通模式 +const URL_PATHINFO = 1; //PATHINFO模式 +const URL_REWRITE = 2; //REWRITE模式 +const URL_COMPAT = 3; // 兼容模式 + +// 类文件后缀 +const EXT = '.class.php'; + +// 系统常量定义 +defined('THINK_PATH') or define('THINK_PATH', __DIR__.'/'); +defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/'); +defined('APP_STATUS') or define('APP_STATUS', ''); // 应用状态 加载对应的配置文件 +defined('APP_DEBUG') or define('APP_DEBUG', false); // 是否调试模式 + +if(function_exists('saeAutoLoader')){// 自动识别SAE环境 + defined('APP_MODE') or define('APP_MODE', 'sae'); + defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae'); +}else{ + defined('APP_MODE') or define('APP_MODE', 'common'); // 应用模式 默认为普通模式 + defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存储类型 默认为File +} + +defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH.'Runtime/'); // 系统运行时目录 +defined('LIB_PATH') or define('LIB_PATH', realpath(THINK_PATH.'Library').'/'); // 系统核心类库目录 +defined('CORE_PATH') or define('CORE_PATH', LIB_PATH.'Think/'); // Think类库目录 +defined('BEHAVIOR_PATH')or define('BEHAVIOR_PATH', LIB_PATH.'Behavior/'); // 行为类库目录 +defined('MODE_PATH') or define('MODE_PATH', THINK_PATH.'Mode/'); // 系统应用模式目录 +defined('VENDOR_PATH') or define('VENDOR_PATH', LIB_PATH.'Vendor/'); // 第三方类库目录 +defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH.'Common/'); // 应用公共目录 +defined('CONF_PATH') or define('CONF_PATH', COMMON_PATH.'Conf/'); // 应用配置目录 +defined('LANG_PATH') or define('LANG_PATH', COMMON_PATH.'Lang/'); // 应用语言目录 +defined('HTML_PATH') or define('HTML_PATH', APP_PATH.'Html/'); // 应用静态目录 +defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH.'Logs/'); // 应用日志目录 +defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH.'Temp/'); // 应用缓存目录 +defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH.'Data/'); // 应用数据目录 +defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH.'Cache/'); // 应用模板缓存目录 +defined('CONF_EXT') or define('CONF_EXT', '.php'); // 配置文件后缀 +defined('CONF_PARSE') or define('CONF_PARSE', ''); // 配置文件解析方法 +defined('ADDON_PATH') or define('ADDON_PATH', APP_PATH.'Addon'); + +// 系统信息 +if(version_compare(PHP_VERSION,'5.4.0','<')) { + ini_set('magic_quotes_runtime',0); + define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()? true : false); +}else{ + define('MAGIC_QUOTES_GPC',false); +} +define('IS_CGI',(0 === strpos(PHP_SAPI,'cgi') || false !== strpos(PHP_SAPI,'fcgi')) ? 1 : 0 ); +define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 ); +define('IS_CLI',PHP_SAPI=='cli'? 1 : 0); + +if(!IS_CLI) { + // 当前文件名 + if(!defined('_PHP_FILE_')) { + if(IS_CGI) { + //CGI/FASTCGI模式下 + $_temp = explode('.php',$_SERVER['PHP_SELF']); + define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/')); + }else { + define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'],'/')); + } + } + if(!defined('__ROOT__')) { + $_root = rtrim(dirname(_PHP_FILE_),'/'); + define('__ROOT__', (($_root=='/' || $_root=='\\')?'':$_root)); + } +} + +// 加载核心Think类 +require CORE_PATH.'Think'.EXT; +// 应用初始化 +Think\Think::start(); \ No newline at end of file diff --git a/ThinkPHP/Tpl/dispatch_jump.tpl b/ThinkPHP/Tpl/dispatch_jump.tpl new file mode 100644 index 0000000..25d4e4e --- /dev/null +++ b/ThinkPHP/Tpl/dispatch_jump.tpl @@ -0,0 +1,49 @@ +<?php + if(C('LAYOUT_ON')) { + echo '{__NOLAYOUT__}'; + } +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>跳转提示</title> +<style type="text/css"> +*{ padding: 0; margin: 0; } +body{ background: #fff; font-family: '微软雅黑'; color: #333; font-size: 16px; } +.system-message{ padding: 24px 48px; } +.system-message h1{ font-size: 100px; font-weight: normal; line-height: 120px; margin-bottom: 12px; } +.system-message .jump{ padding-top: 10px} +.system-message .jump a{ color: #333;} +.system-message .success,.system-message .error{ line-height: 1.8em; font-size: 36px } +.system-message .detail{ font-size: 12px; line-height: 20px; margin-top: 12px; display:none} +</style> +</head> +<body> +<div class="system-message"> +<?php if(isset($message)) {?> +<h1>:)</h1> +<p class="success"><?php echo($message); ?></p> +<?php }else{?> +<h1>:(</h1> +<p class="error"><?php echo($error); ?></p> +<?php }?> +<p class="detail"></p> +<p class="jump"> +页面自动 <a id="href" href="<?php echo($jumpUrl); ?>">跳转</a> 等待时间: <b id="wait"><?php echo($waitSecond); ?></b> +</p> +</div> +<script type="text/javascript"> +(function(){ +var wait = document.getElementById('wait'),href = document.getElementById('href').href; +var interval = setInterval(function(){ + var time = --wait.innerHTML; + if(time <= 0) { + location.href = href; + clearInterval(interval); + }; +}, 1000); +})(); +</script> +</body> +</html> diff --git a/ThinkPHP/Tpl/page_trace.tpl b/ThinkPHP/Tpl/page_trace.tpl new file mode 100644 index 0000000..8bd3703 --- /dev/null +++ b/ThinkPHP/Tpl/page_trace.tpl @@ -0,0 +1,67 @@ +<div id="think_page_trace" style="position: fixed;bottom:0;right:0;font-size:14px;width:100%;z-index: 999999;color: #000;text-align:left;font-family:'微软雅黑';"> +<div id="think_page_trace_tab" style="display: none;background:white;margin:0;height: 250px;"> +<div id="think_page_trace_tab_tit" style="height:30px;padding: 6px 12px 0;border-bottom:1px solid #ececec;border-top:1px solid #ececec;font-size:16px"> + <?php foreach($trace as $key => $value){ ?> + <span style="color:#000;padding-right:12px;height:30px;line-height: 30px;display:inline-block;margin-right:3px;cursor: pointer;font-weight:700"><?php echo $key ?></span> + <?php } ?> +</div> +<div id="think_page_trace_tab_cont" style="overflow:auto;height:212px;padding: 0; line-height: 24px"> + <?php foreach($trace as $info) { ?> + <div style="display:none;"> + <ol style="padding: 0; margin:0"> + <?php + if(is_array($info)){ + foreach ($info as $k=>$val){ + echo '<li style="border-bottom:1px solid #EEE;font-size:14px;padding:0 12px">' . (is_numeric($k) ? '' : $k.' : ') . htmlentities($val,ENT_COMPAT,'utf-8') .'</li>'; + } + } + ?> + </ol> + </div> + <?php } ?> +</div> +</div> +<div id="think_page_trace_close" style="display:none;text-align:right;height:15px;position:absolute;top:10px;right:12px;cursor: pointer;"><img style="vertical-align:top;" src="data:image/gif;base64,R0lGODlhDwAPAJEAAAAAAAMDA////wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MUQxMjc1MUJCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MUQxMjc1MUNCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxRDEyNzUxOUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxRDEyNzUxQUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAAPAA8AAAIdjI6JZqotoJPR1fnsgRR3C2jZl3Ai9aWZZooV+RQAOw==" /></div> +</div> +<div id="think_page_trace_open" style="height:30px;float:right;text-align: right;overflow:hidden;position:fixed;bottom:0;right:0;color:#000;line-height:30px;cursor:pointer;"><div style="background:#232323;color:#FFF;padding:0 6px;float:right;line-height:30px;font-size:14px"><?php echo G('beginTime','viewEndTime').'s ';?></div><img width="30" style="" title="ShowPageTrace" src="data:image/png;base64,<?php echo \Think\App::logo() ?>"></div> +<script type="text/javascript"> +(function(){ +var tab_tit = document.getElementById('think_page_trace_tab_tit').getElementsByTagName('span'); +var tab_cont = document.getElementById('think_page_trace_tab_cont').getElementsByTagName('div'); +var open = document.getElementById('think_page_trace_open'); +var close = document.getElementById('think_page_trace_close').childNodes[0]; +var trace = document.getElementById('think_page_trace_tab'); +var cookie = document.cookie.match(/thinkphp_show_page_trace=(\d\|\d)/); +var history = (cookie && typeof cookie[1] != 'undefined' && cookie[1].split('|')) || [0,0]; +open.onclick = function(){ + trace.style.display = 'block'; + this.style.display = 'none'; + close.parentNode.style.display = 'block'; + history[0] = 1; + document.cookie = 'thinkphp_show_page_trace='+history.join('|') +} +close.onclick = function(){ + trace.style.display = 'none'; +this.parentNode.style.display = 'none'; + open.style.display = 'block'; + history[0] = 0; + document.cookie = 'thinkphp_show_page_trace='+history.join('|') +} +for(var i = 0; i < tab_tit.length; i++){ + tab_tit[i].onclick = (function(i){ + return function(){ + for(var j = 0; j < tab_cont.length; j++){ + tab_cont[j].style.display = 'none'; + tab_tit[j].style.color = '#999'; + } + tab_cont[i].style.display = 'block'; + tab_tit[i].style.color = '#000'; + history[1] = i; + document.cookie = 'thinkphp_show_page_trace='+history.join('|') + } + })(i) +} +parseInt(history[0]) && open.click(); +(tab_tit[history[1]] || tab_tit[0]).click(); +})(); +</script> diff --git a/ThinkPHP/Tpl/think_exception.tpl b/ThinkPHP/Tpl/think_exception.tpl new file mode 100644 index 0000000..61fd007 --- /dev/null +++ b/ThinkPHP/Tpl/think_exception.tpl @@ -0,0 +1,58 @@ +<?php + if(C('LAYOUT_ON')) { + echo '{__NOLAYOUT__}'; + } +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head> +<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> +<title>系统发生错误</title> +<style type="text/css"> +*{ padding: 0; margin: 0; } +html{ overflow-y: scroll; } +body{ background: #fff; font-family: '微软雅黑'; color: #333; font-size: 16px; } +img{ border: 0; } +.error{ padding: 24px 48px; } +.face{ font-size: 100px; font-weight: normal; line-height: 120px; margin-bottom: 12px; } +h1{ font-size: 32px; line-height: 48px; } +.error .content{ padding-top: 10px} +.error .info{ margin-bottom: 12px; } +.error .info .title{ margin-bottom: 3px; } +.error .info .title h3{ color: #000; font-weight: 700; font-size: 16px; } +.error .info .text{ line-height: 24px; } +.copyright{ padding: 12px 48px; color: #999; } +.copyright a{ color: #000; text-decoration: none; } +</style> +</head> +<body> +<div class="error"> +<p class="face">:(</p> +<h1><?php echo strip_tags($e['message']);?></h1> +<div class="content"> +<?php if(isset($e['file'])) {?> + <div class="info"> + <div class="title"> + <h3>错误位置</h3> + </div> + <div class="text"> + <p>FILE: <?php echo $e['file'] ;?>  LINE: <?php echo $e['line'];?></p> + </div> + </div> +<?php }?> +<?php if(isset($e['trace'])) {?> + <div class="info"> + <div class="title"> + <h3>TRACE</h3> + </div> + <div class="text"> + <p><?php echo nl2br($e['trace']);?></p> + </div> + </div> +<?php }?> +</div> +</div> +<div class="copyright"> +<p><a title="官方网站" href="http://www.thinkphp.cn">ThinkPHP</a><sup><?php echo THINK_VERSION ?></sup> { Fast & Simple OOP PHP Framework } -- [ WE CAN DO IT JUST THINK ]</p> +</div> +</body> +</html> diff --git a/ThinkPHP/logo.png b/ThinkPHP/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b195d82d339b3f479a7a79700b6dc5a381ec45 GIT binary patch literal 7396 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 WtUzMry~W1>0000<MNUMnLSTZ{;&Czn literal 0 HcmV?d00001 diff --git a/application/admin/common.php b/application/admin/common.php deleted file mode 100644 index b3d9bbc..0000000 --- a/application/admin/common.php +++ /dev/null @@ -1 +0,0 @@ -<?php diff --git a/application/admin/config.php b/application/admin/config.php deleted file mode 100644 index 10d4f20..0000000 --- a/application/admin/config.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php -//配置文件 -return [ - 'online_time' => 3600 -]; \ No newline at end of file diff --git a/application/admin/controller/ApiFieldsManager.php b/application/admin/controller/ApiFieldsManager.php deleted file mode 100644 index 784bc90..0000000 --- a/application/admin/controller/ApiFieldsManager.php +++ /dev/null @@ -1,535 +0,0 @@ -<?php -/** - * @since 2016-12-13 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\controller; - - -use app\admin\model\ApiBack; -use app\admin\model\ApiFields; - -class ApiFieldsManager extends Base { - - private $dataType = [ - 'string' => '字符串', - 'int' => '整型', - 'float' => '浮点型', - 'boolean' => '布尔型', - 'date' => '日期', - 'array' => '数组', - 'fixed' => '固定值', - 'enum' => '枚举类型', - 'object' => '对象', - ]; - - public function index(){ - if( $this->request->get($this->primaryKey) ){ - session('apiId', $this->request->get($this->primaryKey)); - session('apiName', $this->request->get('name')); - }else{ - if( !session('apiId') ){ - $this->error('缺少必要参数', ''); - } - } - $data = ApiFields::all(['apiId' => session('apiId')]); - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '字段名称' - ], - [ - 'field' => 'type', - 'info' => '字段类型' - ], - [ - 'field' => 'must', - 'info' => '是否必须' - ], - [ - 'field' => 'default', - 'info' => '默认值' - ] - ], - 'topButton' => [ - [ - 'href' => 'ApiFieldsManager/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ], - [ - 'href' => 'ApiFieldsManager/del', - 'class'=> 'btn-danger ajax-delete', - 'info'=> '删除', - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'rightButton' => [ - [ - 'info' => '编辑', - 'href' => 'ApiFieldsManager/edit', - 'class'=> 'btn-primary', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'ApiFieldsManager/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - 'show' => '' - ] - ], - 'typeRule' => [ - 'must' => [ - 'module' => 'icon', - 'rule' => [ - [ - 'info' => '', - 'class' => 'fa fa-close' - ], - [ - 'info' => '', - 'class' => 'fa fa-check' - ] - ] - ], - 'type' => [ - 'module' => 'listValue', - 'rule' => $this->dataType - ], - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function back(){ - if( $this->request->get($this->primaryKey) ){ - session('apiId', $this->request->get($this->primaryKey)); - session('apiName', $this->request->get('name')); - }else{ - if( !session('apiId') ){ - $this->error('缺少必要参数', ''); - } - } - $data = ApiBack::all(['apiId' => session('apiId')]); - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '字段名称' - ], - [ - 'field' => 'type', - 'info' => '字段类型' - ], - [ - 'field' => 'info', - 'info' => '字段说明' - ] - ], - 'topButton' => [ - [ - 'href' => 'ApiFieldsManager/backAdd', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ], - [ - 'href' => 'ApiFieldsManager/backDel', - 'class'=> 'btn-danger ajax-delete', - 'info'=> '删除', - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'rightButton' => [ - [ - 'info' => '编辑', - 'href' => 'ApiFieldsManager/backEdit', - 'class'=> 'btn-primary', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'ApiFieldsManager/backDel', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - 'show' => '' - ] - ], - 'typeRule' => [ - 'type' => [ - 'module' => 'listValue', - 'rule' => $this->dataType - ], - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function add(){ - if( $this->request->isPost() ){ - $apiModel = new ApiFields(); - $result = $apiModel->allowField(true)->save($this->request->post()); - if(false === $result){ - $this->error($apiModel->getError()); - }else{ - $this->success('操作成功!', url('ApiFieldsManager/index')); - } - }else{ - $form = [ - 'formTitle' => $this->menuInfo['name']."(".session('apiName').")", - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('ApiFieldsManager/add'), - 'formId' => 'add-ApiFieldsManager-form', - 'backUrl' => url('ApiFieldsManager/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => 'apiId', - 'value' => session('apiId'), - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '字段名称:', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '字段类型:', - 'attr' => [ - 'name' => 'type', - 'value' => '', - 'options' => $this->dataType - ] - ], - [ - 'module' => 'radio', - 'description' => '', - 'info' => '是否必须:', - 'attr' => [ - 'name' => 'must', - 'value' => '', - 'options' => [ - '不必须', - '必须', - ] - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '默认值:', - 'attr' => [ - 'name' => 'default', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '字段描述:', - 'attr' => [ - 'name' => 'info', - 'value' => '', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function backAdd(){ - if( $this->request->isPost() ){ - $apiModel = new ApiBack(); - $result = $apiModel->allowField(true)->save($this->request->post()); - if(false === $result){ - $this->error($apiModel->getError()); - }else{ - $this->success('操作成功!', url('ApiFieldsManager/back')); - } - }else{ - $form = [ - 'formTitle' => $this->menuInfo['name']."(".session('apiName').")", - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('ApiFieldsManager/backAdd'), - 'formId' => 'add-ApiFieldsManager-form', - 'backUrl' => url('ApiFieldsManager/back'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => 'apiId', - 'value' => session('apiId'), - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '字段名称:', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '字段类型:', - 'attr' => [ - 'name' => 'type', - 'value' => '', - 'options' => $this->dataType - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '字段描述:', - 'attr' => [ - 'name' => 'info', - 'value' => '', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function edit(){ - if( $this->request->isPut() ){ - $data = $this->request->put(); - $apiModel = new ApiFields(); - $apiModel->update($data); - $this->success('操作成功!', url('ApiFieldsManager/index')); - }else{ - $detail = ApiFields::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name']."(".session('apiName').")", - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('ApiFieldsManager/edit'), - 'formId' => 'edit-ApiFieldsManager-form', - 'backUrl' => url('ApiFieldsManager/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => 'apiId', - 'value' => session('apiId'), - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '字段名称:', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '字段类型:', - 'attr' => [ - 'name' => 'type', - 'value' => $detail['type'], - 'options' => $this->dataType - ] - ], - [ - 'module' => 'radio', - 'description' => '', - 'info' => '是否必须:', - 'attr' => [ - 'name' => 'must', - 'value' => $detail['must'], - 'options' => [ - '不必须', - '必须', - ] - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '默认值:', - 'attr' => [ - 'name' => 'default', - 'value' => $detail['default'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '字段描述:', - 'attr' => [ - 'name' => 'info', - 'value' => $detail['info'], - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function backEdit(){ - if( $this->request->isPut() ){ - $data = $this->request->put(); - $apiModel = new ApiBack(); - $apiModel->update($data); - $this->success('操作成功!', url('ApiFieldsManager/back')); - }else{ - $detail = ApiBack::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name']."(".session('apiName').")", - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('ApiFieldsManager/backEdit'), - 'formId' => 'edit-ApiFieldsManager-form', - 'backUrl' => url('ApiFieldsManager/back'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => 'apiId', - 'value' => session('apiId'), - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '字段名称:', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '字段类型:', - 'attr' => [ - 'name' => 'type', - 'value' => $detail['type'], - 'options' => $this->dataType - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '字段描述:', - 'attr' => [ - 'name' => 'info', - 'value' => $detail['info'], - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $delNum = ApiFields::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('ApiFieldsManager/index')); - } - } - $this->error('操作失败!'); - } - - public function backDel(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $delNum = ApiBack::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('ApiFieldsManager/back')); - } - } - $this->error('操作失败!'); - } -} \ No newline at end of file diff --git a/application/admin/controller/ApiManager.php b/application/admin/controller/ApiManager.php deleted file mode 100644 index 34edb92..0000000 --- a/application/admin/controller/ApiManager.php +++ /dev/null @@ -1,400 +0,0 @@ -<?php -/** - * @since 2016-12-12 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\controller; - - -use app\admin\model\Api; - -class ApiManager extends Base { - - private $apps; - - public function _myInitialize() { - $this->apps = cache(CacheType::APP_LIST_KEY); - if( !$this->apps ){ - $this->error('请先配置应用!', url('AppManager/index')); - }else{ - $this->apps = [0 => '不关联'] + $this->apps; - } - } - - public function index(){ - if( $this->request->get($this->primaryKey) ){ - $data = Api::all(['appId' => $this->request->get($this->primaryKey)]); - }else{ - $data = Api::all(); - } - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '接口名称' - ], - [ - 'field' => 'mark', - 'info' => '接口标记' - ], - [ - 'field' => 'map', - 'info' => '接口映射' - ], - [ - 'field' => 'version', - 'info' => '接口版本' - ], - [ - 'field' => 'status', - 'info' => '状态' - ] - ], - 'topButton' => [ - [ - 'href' => 'ApiManager/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ], - [ - 'href' => 'ApiManager/del', - 'class'=> 'btn-danger ajax-delete', - 'info'=> '删除', - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'rightButton' => [ - [ - 'info' => '启用', - 'href' => 'ApiManager/open', - 'class'=> 'btn-success ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-check', - 'confirm' => 1, - 'show' => ['status', 0] - ], - [ - 'info' => '禁用', - 'href' => 'ApiManager/close', - 'class'=> 'btn-warning ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-close', - 'confirm' => 1, - 'show' => ['status', 1] - ], - [ - 'info' => '编辑', - 'href' => 'ApiManager/edit', - 'class'=> 'btn-primary', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => 'API文档【开发中】', - 'href' => 'WikiManager/api', - 'class'=> 'btn-success', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-support', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '请求参数', - 'href' => 'ApiFieldsManager/index', - 'class'=> 'btn-warning', - 'param'=> [$this->primaryKey, 'name'], - 'icon' => 'fa fa-sign-in', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '返回参数', - 'href' => 'ApiFieldsManager/back', - 'class'=> 'btn-info', - 'param'=> [$this->primaryKey, 'name'], - 'icon' => 'fa fa-sign-out', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'ApiManager/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - 'show' => '' - ] - ], - 'typeRule' => [ - 'status' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '禁用', - 'class' => 'label label-danger' - ], - [ - 'info' => '启用', - 'class' => 'label label-success' - ] - ] - ] - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function add(){ - if( $this->request->isPost() ){ - $apiModel = new Api(); - $result = $apiModel->allowField(true)->save($this->request->post()); - if(false === $result){ - $this->error($apiModel->getError()); - }else{ - $this->success('操作成功!', url('ApiManager/index')); - } - }else{ - $map = uniqid(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('ApiManager/add'), - 'formId' => 'add-ApiManager-form', - 'backUrl' => url('ApiManager/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '映射为系统自动生成,并且不可修改', - 'info' => 'API映射:', - 'attr' => [ - 'name' => 'map', - 'value' => $map, - 'placeholder' => '', - 'readOnly' => true - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '适配APP:', - 'attr' => [ - 'name' => 'appId', - 'value' => '', - 'options' => $this->apps - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API名称:', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API标记:', - 'attr' => [ - 'name' => 'mark', - 'value' => '', - 'placeholder' => '请求第三方API服务时候需要拼接的URL,例如:index/index' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API版本:', - 'attr' => [ - 'name' => 'version', - 'value' => '', - 'placeholder' => '建议使用:v1.1.1这类的版本号' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API提示:', - 'attr' => [ - 'name' => 'warning', - 'value' => '', - 'placeholder' => '用于API文档生成' - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => 'API描述:', - 'attr' => [ - 'name' => 'info', - 'value' => '', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function open(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $apiObj = Api::get([$this->primaryKey => $id]); - if( is_null($apiObj) ){ - $this->error('当前API不存在',''); - }else{ - $apiObj->status = 1; - $apiObj->save(); - $this->success('操作成功', url('ApiManager/index')); - } - } - } - - public function close(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $apiObj = Api::get([$this->primaryKey => $id]); - if( is_null($apiObj) ){ - $this->error('当前API不存在',''); - }else{ - $apiObj->status = 0; - $apiObj->save(); - $this->success('操作成功', url('ApiManager/index')); - } - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $delNum = Api::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('ApiManager/index')); - } - } - $this->error('操作失败!'); - } - - public function edit(){ - if( $this->request->isPut() ){ - if( empty($this->request->put('name')) ){ - $this->error('应用名称不能为空', ''); - } - $data = $this->request->put(); - $appMemberModel = new Api(); - $appMemberModel->update($data); - $this->success('操作成功!', url('ApiManager/index')); - }else{ - $detail = Api::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('ApiManager/edit'), - 'formId' => 'edit-ApiManager-form', - 'backUrl' => url('ApiManager/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '映射为系统自动生成,并且不可修改', - 'info' => 'API映射:', - 'attr' => [ - 'name' => 'map', - 'value' => $detail['map'], - 'placeholder' => '', - 'readOnly' => true - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '适配APP:', - 'attr' => [ - 'name' => 'appId', - 'value' => $detail['appId'], - 'options' => $this->apps - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API名称:', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API标记:', - 'attr' => [ - 'name' => 'mark', - 'value' => $detail['mark'], - 'placeholder' => '请求第三方API服务时候需要拼接的URL,例如:index/index' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API版本:', - 'attr' => [ - 'name' => 'version', - 'value' => $detail['version'], - 'placeholder' => '建议使用:v1.1.1这类的版本号' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => 'API提示:', - 'attr' => [ - 'name' => 'warning', - 'value' => $detail['warning'], - 'placeholder' => '用于API文档生成' - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => 'API描述:', - 'attr' => [ - 'name' => 'info', - 'value' => $detail['info'], - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - -} \ No newline at end of file diff --git a/application/admin/controller/AppManager.php b/application/admin/controller/AppManager.php deleted file mode 100644 index a417a15..0000000 --- a/application/admin/controller/AppManager.php +++ /dev/null @@ -1,362 +0,0 @@ -<?php -/** - * APP管理 - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -use app\admin\model\App; - -class AppManager extends Base { - - public function index(){ - $data = App::all(); - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '应用名称' - ], - [ - 'field' => 'info', - 'info' => '应用描述' - ], - [ - 'field' => 'type', - 'info' => '参与方式' - ], - [ - 'field' => 'status', - 'info' => '状态' - ] - ], - 'topButton' => [ - [ - 'href' => 'AppManager/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ], - [ - 'href' => 'AppManager/del', - 'class'=> 'btn-danger ajax-delete', - 'info'=> '删除', - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'rightButton' => [ - [ - 'info' => '启用', - 'href' => 'AppManager/open', - 'class'=> 'btn-success ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-check', - 'confirm' => 1, - 'show' => ['status', 0] - ], - [ - 'info' => '禁用', - 'href' => 'AppManager/close', - 'class'=> 'btn-warning ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-close', - 'confirm' => 1, - 'show' => ['status', 1] - ], - [ - 'info' => '编辑', - 'href' => 'AppManager/edit', - 'class'=> 'btn-primary', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => 'API文档【开发中】', - 'href' => 'WikiManager/app', - 'class'=> 'btn-success', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-support', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => 'API列表', - 'href' => 'ApiManager/index', - 'class'=> 'btn-info', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-link', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'AppManager/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - 'show' => '' - ] - ], - 'typeRule' => [ - 'type' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '监视方式', - 'class' => 'label label-info' - ], - [ - 'info' => '网关方式', - 'class' => 'label label-primary' - ] - ] - ], - 'status' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '禁用', - 'class' => 'label label-danger' - ], - [ - 'info' => '启用', - 'class' => 'label label-success' - ] - ] - ] - ], - 'data' => $data - ]; - $appListCache = []; - foreach ( $data as $key => $value ){ - $appListCache[$value['id']] = $value['name']; - } - cache( CacheType::APP_LIST_KEY, $appListCache ); - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function add(){ - if( $this->request->isPost() ){ - $appModel = new App(); - $result = $appModel->allowField(true)->save($this->request->post()); - if(false === $result){ - $this->error($appModel->getError()); - }else{ - $this->success('操作成功!', url('AppManager/index')); - } - }else{ - $auth = cache(CacheType::AUTH_LIST_KEY); -// if( !$auth ){ -// $this->error('请先配置认证方式!', url('OAuth/index')); -// } - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('AppManager/add'), - 'formId' => 'add-AppManager-form', - 'backUrl' => url('AppManager/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '应用名称:', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '基础链接:', - 'attr' => [ - 'name' => 'baseUrl', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '参与方式:', - 'attr' => [ - 'name' => 'type', - 'value' => '', - 'options' => [ - '监视方式', - '网关方式' - ] - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '认证方式:', - 'attr' => [ - 'name' => 'oauth', - 'value' => '', - 'options' => $auth - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '应用描述:', - 'attr' => [ - 'name' => 'info', - 'value' => '', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function open(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $appObj = App::get([$this->primaryKey => $id]); - if( is_null($appObj) ){ - $this->error('当前应用不存在',''); - }else{ - $appObj->status = 1; - $appObj->save(); - $this->success('操作成功', url('AppManager/index')); - } - } - } - - public function close(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $appObj = App::get([$this->primaryKey => $id]); - if( is_null($appObj) ){ - $this->error('当前应用不存在',''); - }else{ - $appObj->status = 0; - $appObj->save(); - $this->success('操作成功', url('AppManager/index')); - } - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $delNum = App::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('AppManager/index')); - } - } - $this->error('操作失败!'); - } - - public function edit(){ - if( $this->request->isPut() ){ - if( empty($this->request->put('name')) ){ - $this->error('应用名称不能为空', ''); - } - $data = $this->request->put(); - $appMemberModel = new App(); - $appMemberModel->update($data); - $this->success('操作成功!', url('AppManager/index')); - }else{ - $auth = cache(CacheType::AUTH_LIST_KEY); -// if( !$auth ){ -// $this->error('请先配置认证方式!', url('OAuth/index')); -// } - $detail = App::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('AppManager/edit'), - 'formId' => 'edit-AppManager-form', - 'backUrl' => url('AppManager/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '应用名称:', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '基础链接:', - 'attr' => [ - 'name' => 'baseUrl', - 'value' => $detail['baseUrl'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '参与方式:', - 'attr' => [ - 'name' => 'type', - 'value' => $detail['type'], - 'options' => [ - '监视方式', - '网关方式' - ] - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '认证方式:', - 'attr' => [ - 'name' => 'oauth', - 'value' => '', - 'options' => $auth - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '应用描述:', - 'attr' => [ - 'name' => 'info', - 'value' => $detail['info'], - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - -} \ No newline at end of file diff --git a/application/admin/controller/AppMember.php b/application/admin/controller/AppMember.php deleted file mode 100644 index 8ad08ea..0000000 --- a/application/admin/controller/AppMember.php +++ /dev/null @@ -1,268 +0,0 @@ -<?php -/** - * @since 2016-11-26 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\controller; - - -class AppMember extends Base { - - public function index(){ - $data = \app\admin\model\AppMember::all(); - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '用户名称' - ], - [ - 'field' => 'phone', - 'info' => '绑定手机号' - ], - [ - 'field' => 'email', - 'info' => '绑定邮箱' - ], - [ - 'field' => 'status', - 'info' => '状态' - ] - ], - 'topButton' => [ - [ - 'href' => 'AppMember/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ] - ], - 'rightButton' => [ - [ - 'info' => '启用', - 'href' => 'AppMember/open', - 'class'=> 'btn-success ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-check', - 'confirm' => 1, - 'show' => ['status', 0] - ], - [ - 'info' => '禁用', - 'href' => 'AppMember/close', - 'class'=> 'btn-warning ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-close', - 'confirm' => 1, - 'show' => ['status', 1] - ], - [ - 'info' => '编辑', - 'href' => 'AppMember/edit', - 'class'=> 'btn-primary', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'AppMember/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'typeRule' => [ - 'status' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '禁用', - 'class' => 'label label-danger' - ], - [ - 'info' => '启用', - 'class' => 'label label-success' - ] - ] - ] - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function add(){ - if( $this->request->isPost() ){ - $appMemberModel = new \app\admin\model\AppMember(); - $result = $appMemberModel->allowField(true)->validate( - [ - 'name' => 'require', - ],[ - 'name.require' => '管理员名称不能为空', - ] - )->save($this->request->post()); - if(false === $result){ - $this->error($appMemberModel->getError()); - }else{ - $this->success('操作成功!', url('AppMember/index')); - } - }else{ - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('AppMember/add'), - 'formId' => 'add-AppMember-form', - 'backUrl' => url('AppMember/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '管理员名称:', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '暂不生效', - 'info' => '绑定手机:', - 'attr' => [ - 'name' => 'phone', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '绑定邮箱:', - 'attr' => [ - 'name' => 'email', - 'value' => '', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function open(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $appMemberObj = \app\admin\model\AppMember::get([$this->primaryKey => $id]); - if( is_null($appMemberObj) ){ - $this->error('管理员不存在',''); - }else{ - $appMemberObj->status = 1; - $appMemberObj->save(); - $this->success('操作成功', url('AppMember/index')); - } - } - } - - public function close(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $appMemberObj = \app\admin\model\AppMember::get([$this->primaryKey => $id]); - if( is_null($appMemberObj) ){ - $this->error('管理员不存在',''); - }else{ - $appMemberObj->status = 0; - $appMemberObj->save(); - $this->success('操作成功', url('AppMember/index')); - } - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $delNum = \app\admin\model\AppMember::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('AppMember/index')); - } - } - $this->error('操作失败!'); - } - - public function edit(){ - if( $this->request->isPut() ){ - if( empty($this->request->put('name')) ){ - $this->error('管理员名称不能为空', ''); - } - $data = $this->request->put(); - $appMemberModel = new \app\admin\model\AppMember(); - $appMemberModel->update($data); - $this->success('操作成功!', url('AppMember/index')); - }else{ - $detail = \app\admin\model\AppMember::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('AppMember/edit'), - 'formId' => 'edit-AppMember-form', - 'backUrl' => url('AppMember/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '用户名称:', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '', - 'disabled' => false - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '绑定手机:', - 'attr' => [ - 'name' => 'phone', - 'value' => $detail['phone'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '绑定邮箱:', - 'attr' => [ - 'name' => 'email', - 'value' => $detail['email'], - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - -} \ No newline at end of file diff --git a/application/admin/controller/Auth.php b/application/admin/controller/Auth.php deleted file mode 100644 index 91d3278..0000000 --- a/application/admin/controller/Auth.php +++ /dev/null @@ -1,606 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -use app\admin\model\AuthGroup; -use app\admin\model\AuthGroupAccess; -use app\admin\model\AuthRule; -use app\admin\model\User; -use app\admin\model\UserData; -use think\Validate; - -class Auth extends Base { - /** - * 用户组列表获取 - */ - public function index(){ - $data = []; - $dataObj = AuthGroup::all(); - if( !is_null($dataObj) ){ - foreach ($dataObj as $value){ - $data[] = $value->toArray(); - } - } - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '用户组' - ], - [ - 'field' => 'description', - 'info' => '描述' - ], - [ - 'field' => 'access', - 'info' => '访问授权' - ], - [ - 'field' => 'userAuth', - 'info' => '成员授权' - ], - [ - 'field' => 'status', - 'info' => '状态' - ] - ], - 'topButton' => [ - [ - 'href' => 'Auth/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ] - ], - 'rightButton' => [ - [ - 'info' => '编辑', - 'href' => 'Auth/edit', - 'class'=> 'btn-info', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '启用', - 'href' => 'Auth/open', - 'class'=> 'btn-success ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-check', - 'confirm' => 1, - 'show' => ['status', 0] - ], - [ - 'info' => '禁用', - 'href' => 'Auth/close', - 'class'=> 'btn-warning ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-close', - 'confirm' => 1, - 'show' => ['status', 1] - ], - [ - 'info' => '删除', - 'href' => 'Auth/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'typeRule' => [ - 'access' => [ - 'module' => 'a', - 'rule' => [ - 'info' => '访问授权', - 'href' => url('Auth/access'), - 'param'=> [$this->primaryKey], - 'class' => 'refresh' - ] - ], - 'userAuth' => [ - 'module' => 'a', - 'rule' => [ - 'info' => '成员授权', - 'href' => url('Auth/userAuth'), - 'param'=> [$this->primaryKey], - 'class' => 'refresh' - ] - ], - 'hide' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '显示', - 'class' => 'label label-success' - ], - [ - 'info' => '隐藏', - 'class' => 'label label-warning' - ] - ] - ], - 'status' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '禁用', - 'class' => 'label label-danger' - ], - [ - 'info' => '启用', - 'class' => 'label label-success' - ] - ] - ] - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - /** - * 新增权限组 - */ - public function add(){ - if( $this->request->isPost() ){ - $authGroupModel = new AuthGroup(); - $result = $authGroupModel->allowField(true)->validate( - [ - 'name' => 'require', - ],[ - 'name.require' => '用户组名不能为空', - ] - )->save($this->request->post()); - if(false === $result){ - $this->error($authGroupModel->getError()); - }else{ - $this->success('操作成功!', url('Auth/index')); - } - }else { - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('Auth/add'), - 'formId' => 'add-authGroup-form', - 'backUrl' => url('Auth/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '用户组名称:', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '用户组描述:', - 'attr' => [ - 'name' => 'description', - 'value' => '', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - /** - * 编辑用户组 - */ - public function edit(){ - if( $this->request->isPut() ){ - $data = $this->request->put(); - $validate = new Validate([ - 'name' => 'require', - ],[ - 'name.require' => '用户组名不能为空', - ]); - if(!$validate->check($data)){ - $this->error($validate->getError()); - }else{ - $menuModel = new AuthGroup(); - $menuModel->allowField(true)->update($data); - $this->success('操作成功!', url('Auth/index')); - } - }else{ - $detail = AuthGroup::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('Auth/edit'), - 'formId' => 'edit-authGroup-form', - 'backUrl' => url('Auth/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail['id'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '用户组名称:', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '用户组描述:', - 'attr' => [ - 'name' => 'description', - 'value' => $detail['description'], - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - /** - * 启用用户组 - */ - public function open(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $authGroupObj = AuthGroup::get([$this->primaryKey => $id]); - if( is_null($authGroupObj) ){ - $this->error('用户组不存在',''); - }else{ - $authGroupObj->status = 1; - $authGroupObj->save(); - $this->success('操作成功', url('Auth/index')); - } - } - } - - /** - * 禁用用户组 - */ - public function close(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $authGroupObj = AuthGroup::get([$this->primaryKey => $id]); - if( is_null($authGroupObj) ){ - $this->error('用户组不存在',''); - }else{ - $authGroupObj->status = 0; - $authGroupObj->save(); - $this->success('操作成功', url('Auth/index')); - } - } - } - - /** - * 删除用户组 - */ - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $authAccessNum = AuthGroupAccess::where(['groupId' => $key])->count(); - if( $authAccessNum ){ - $this->error('当前用户组存在用户不能删除!'); - } - AuthGroup::destroy([$this->primaryKey => $key]); - AuthRule::destroy(['groupId' => $key]); - $this->success('操作成功', url('Auth/index')); - } - } - - /** - * 用户授权(加用户入组) - */ - public function group(){ - if( $this->request->isPut() ){ - $authAccessObj = AuthGroupAccess::get(['uid' => $this->request->put('uid')]); - if( is_null($authAccessObj) ){ - $authAccessObj = new AuthGroupAccess(); - } - $authAccessObj->groupId = $this->request->put('groupId'); - $authAccessObj->uid = $this->request->put('uid'); - $authAccessObj->save(); - $this->success('操作成功', url('User/index')); - }else{ - $authAccess = ''; - $authGroupArr = []; - $authAccessObj = AuthGroupAccess::get(['uid' => $this->request->get($this->primaryKey)]); - if( !is_null($authAccessObj) ){ - $authAccess = $authAccessObj->groupId; - } - $authGroupObj = AuthGroup::all(['status' => 1]); - if( !empty($authGroupObj) ){ - foreach ( $authGroupObj as $value ){ - $authGroupArr[$value[$this->primaryKey]] = $value->name; - } - }else{ - $this->result('', ReturnCode::GET_TEMPLATE_ERROR, '没有可用用户组'); - } - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('Auth/group'), - 'formId' => 'add-authGroup-form', - 'backUrl' => url('User/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => 'uid', - 'value' => $this->request->get($this->primaryKey), - 'placeholder' => '' - ] - ], - [ - 'module' => 'radio', - 'description' => '', - 'info' => '请选择用户组:', - 'attr' => [ - 'name' => 'groupId', - 'value' => $authAccess, - 'options' => $authGroupArr - ] - ], - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - /** - * 权限组用户维护 - */ - public function userAuth(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - AuthGroupAccess::destroy([$this->primaryKey => $key]); - $this->success('操作成功', url('Auth/index')); - }else{ - $data = []; - $dataArrObj = AuthGroupAccess::where(['groupId' => $this->request->get($this->primaryKey)])->select(); - if( !empty($dataArrObj) ){ - foreach ( $dataArrObj as $dataObj ){ - $userObj = User::get([$this->primaryKey => $dataObj->uid]); - $userDataObj = UserData::get(['uid' => $dataObj->uid]); - $_data['id'] = $dataObj->id; - $_data['username'] = $userObj->username; - $_data['nickname'] = $userObj->nickname; - if( !is_null($userDataObj) ){ - $userDataObj->toArray(); - $_data['loginTimes'] = $userDataObj['loginTimes']; - $_data['lastLoginTime'] = $userDataObj['lastLoginTime']; - $_data['lastLoginIp'] = $userDataObj['lastLoginIp']; - }else{ - $_data['loginTimes'] = 0; - $_data['lastLoginTime'] = 0; - $_data['lastLoginIp'] = 0; - } - $data[] = $_data; - } - } - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'username', - 'info' => '用户账号' - ], - [ - 'field' => 'nickname', - 'info' => '用户昵称' - ], - [ - 'field' => 'loginTimes', - 'info' => '登录次数' - ], - [ - 'field' => 'lastLoginTime', - 'info' => '最后登录时间' - ], - [ - 'field' => 'lastLoginIp', - 'info' => '最后登录IP' - ] - ], - 'rightButton' => [ - [ - 'info' => '删除', - 'href' => url('Auth/userAuth'), - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'typeRule' => [ - 'lastLoginTime' => [ - 'module' => 'date', - ] - ], - 'data' => $data - ]; - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - /** - * 加载权限因子 - */ - public function access(){ - $authList = cache('AuthRule'); - if( !$authList ){ - $authList = $this->refreshAuth(); - } - if( $this->request->isPut() ){ - $gid = session('authGid'); - if( !$gid ){ - $this->error('组ID丢失!'); - } - $url = $this->request->put('urlName'); - $getAuth = $this->request->put('get'); - $putAuth = $this->request->put('put'); - $deleteAuth = $this->request->put('delete'); - $postAuth = $this->request->put('post'); - $auth = \Permission::AUTH_GET * $getAuth + \Permission::AUTH_DELETE * $deleteAuth + \Permission::AUTH_POST * $postAuth + \Permission::AUTH_PUT * $putAuth; - $authDetail = AuthRule::get( ['groupId' => $gid, 'url' => $url] ); - if( $authDetail ){ - $authDetail->auth = $auth; - $authDetail->save(); - }else{ - $newAuthDetail = new AuthRule(); - $newAuthDetail->url = $url; - $newAuthDetail->groupId = $gid; - $newAuthDetail->auth = $auth; - $newAuthDetail->save(); - } - $this->success('更新成功!', url('Auth/access'), '', 1); - }else{ - $gid = $this->request->get('id')?$this->request->get('id'):session('authGid'); - if( !$gid ){ - $this->result('', ReturnCode::GET_TEMPLATE_ERROR, '组ID丢失!'); - }else{ - session('authGid', $gid); - } - $authRuleArr = AuthRule::where(['groupId' => $gid])->select(); - if( $authRuleArr ){ - $authRule = []; - foreach ( $authRuleArr as $value ){ - $authRule[$value->url] = $value->auth; - } - foreach ( $authList as &$authValue ){ - $authRuleValue = isset($authRule[$authValue['url']])?$authRule[$authValue['url']]:0; - $authValue['get'] = \Permission::AUTH_GET & $authRuleValue; - $authValue['post'] = \Permission::AUTH_POST & $authRuleValue; - $authValue['put'] = \Permission::AUTH_PUT & $authRuleValue; - $authValue['delete'] = \Permission::AUTH_DELETE & $authRuleValue; - } - } - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'showName', - 'info' => '权限名称' - ], - [ - 'field' => 'url', - 'info' => 'URL标识' - ], - [ - 'field' => 'token', - 'info' => '真实URL' - ], - [ - 'field' => 'get', - 'info' => 'Get' - ], - [ - 'field' => 'put', - 'info' => 'Put' - ], - [ - 'field' => 'post', - 'info' => 'Post' - ], - [ - 'field' => 'delete', - 'info' => 'Delete' - ] - ], - 'typeRule' => [ - 'post' => [ - 'module' => 'auth', - 'rule' => [ - 'value' => '', - 'url' => url('Auth/access') - ] - ], - 'get' => [ - 'module' => 'auth', - 'rule' => [ - 'value' => '', - 'url' => url('Auth/access') - ] - ], - 'put' => [ - 'module' => 'auth', - 'rule' => [ - 'value' => '', - 'url' => url('Auth/access') - ] - ], - 'delete' => [ - 'module' => 'auth', - 'rule' => [ - 'value' => '', - 'url' => url('Auth/access') - ] - ] - ], - 'data' => $authList - ]; - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - /** - * 刷新权限因子缓存 - * @param array $menu - * @return array - */ - public function refreshAuth( $menu = [] ){ - if( empty($menu) ){ - $menuObj = \app\admin\model\Menu::all(function($query){ - $query->order('sort', 'asc'); - }); - foreach ($menuObj as $value){ - $menuArr = $value->toArray(); - if( $menuArr['url'] ){ - $menuArr['token'] = url($menuArr['url']); - }else{ - $menuArr['token'] = ''; - } - $menu[] = $menuArr; - } - $menu = formatTree(listToTree($menu)); - } - cache('AuthRule', $menu); - return $menu; - } - - -} \ No newline at end of file diff --git a/application/admin/controller/Base.php b/application/admin/controller/Base.php deleted file mode 100644 index 1adaed7..0000000 --- a/application/admin/controller/Base.php +++ /dev/null @@ -1,175 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - -use app\admin\model\Menu; -use app\admin\model\User; -use think\Controller; - -class Base extends Controller { - - public $primaryKey; - public $uid; - public $userInfo; - public $url; - public $menuInfo; - - private $CORS = false; - private $superUrl = [ - 'User/login', - 'User/logout' - ]; - - public function _initialize(){ - $this->primaryKey = config('SQL_PRIMARY_KEY'); - - //初始化系统 - $this->uid = session('uid'); - $this->assign('uid',$this->uid); - $this->iniSystem(); - - //控制器初始化 - if(method_exists($this,'_myInitialize')){ - $this->_myInitialize(); - } - - if( $this->CORS ){ - header('Access-Control-Allow-Origin: *'); - header('Access-Control-Allow-Credentials: true'); - header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); - header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description'); - $_SERVER['HTTP_X_REQUESTED_WITH'] = 'xmlHttpRequest'; - } - } - - /** - * 自定义初始化函数 - */ - public function _myInitialize(){} - - /** - * 空方法默认的页面 - */ - public function _empty(){ - return (new PublicShow())->show_404(); - } - - /** - * 过滤没有权限和隐藏的菜单 - * @param $temp - * @return mixed - */ - protected function _prepareTemplate( $temp ){ - $MenuInfo = Menu::where([])->column('hide','url'); - if( !isAdministrator() ){ - $authList = (new \Permission())->getAuthList($this->uid); - switch ( $temp['tempType'] ){ - case 'table': - foreach ( $temp['topButton'] as $key => $value ){ - if( !isset($authList[$value['href']]) || !$authList[$value['href']] ){ - unset($temp['topButton'][$key]); - }else{ - if( !isset($MenuInfo[$value['href']]) || $MenuInfo[$value['href']] ){ - unset($temp['topButton'][$key]); - }else{ - $temp['topButton'][$key]['href'] = url($value['href']); - } - } - } - $temp['topButton'] = array_values($temp['topButton']); - foreach ( $temp['rightButton'] as $k => $v ){ - if( !isset($authList[$v['href']]) || !$authList[$v['href']] ){ - unset($temp['rightButton'][$k]); - }else{ - if( !isset($MenuInfo[$v['href']]) || $MenuInfo[$v['href']] ){ - unset($temp['rightButton'][$k]); - }else{ - $temp['rightButton'][$k]['href'] = url($v['href']); - } - } - } - $temp['rightButton'] = array_values($temp['rightButton']); - break; - case 'form': - break; - } - }else{ - switch ( $temp['tempType'] ){ - case 'table': - foreach ( $temp['topButton'] as $key => $value ){ - $temp['topButton'][$key]['href'] = url($value['href']); - } - $temp['topButton'] = array_values($temp['topButton']); - foreach ( $temp['rightButton'] as $k => $v ){ - $temp['rightButton'][$k]['href'] = url($v['href']); - } - $temp['rightButton'] = array_values($temp['rightButton']); - break; - case 'form': - break; - } - } - return $temp; - } - - /** - * 系统初始化函数(登陆状态检测,权限检测,初始化菜单) - */ - private function iniSystem(){ - $this->url = $this->request->controller().'/'.$this->request->action(); - if( !in_array($this->url, $this->superUrl) ){ - $menuInfo = Menu::where(['url' => $this->url])->find(); - if( is_null($menuInfo) ){ - $this->error( '目录:'.$this->url.'不存在!', '' ); - }else{ - $this->menuInfo = $menuInfo->toArray(); - } - $this->checkLogin(); - $this->checkRule(); - } - } - - /** - * 用户登录状态检测 - */ - private function checkLogin(){ - if( isset($this->uid) && !empty($this->uid) ){ - $sidNow = session_id(); - $sidOld = cache($this->uid); - if( isset($sidOld) && !empty($sidOld) ){ - if( $sidOld != $sidNow ){ - $this->error("您的账号在别的地方登录了,请重新登录!", url('User/login'), ReturnCode::ERROR_BY_REFRESH_PAGE); - }else{ - cache($this->uid, $sidNow, config('online_time')); - $this->userInfo = User::get([ $this->primaryKey => $this->uid ])->toArray(); -// if( $this->userInfo['updateTime'] === 0 ){ -// $this->error('初次登录请重置用户密码!', url('User/changePassWord')); -// }else{ -// if( empty($this->userInfo['nickName']) ){ -// $this->error('初次登录请设置用户昵称!', url('User/changeNickname')); -// } -// } - } - }else{ - $this->error("登录超时,请重新登录!", url('User/login'), ReturnCode::ERROR_BY_REFRESH_PAGE); - } - }else{ - $this->redirect('User/login'); - } - } - - /** - * 权限检测&权限验证 - */ - private function checkRule(){ - $check = (new \Permission())->check($this->url, $this->uid); - if( !$check && !isAdministrator() ){ - $this->error('权限认证失败!', ''); - } - } -} \ No newline at end of file diff --git a/application/admin/controller/CacheType.php b/application/admin/controller/CacheType.php deleted file mode 100644 index a9eb5ff..0000000 --- a/application/admin/controller/CacheType.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -/** - * 项目缓存Key管理 - * @since 2016-11-30 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\controller; - - -class CacheType { - - const FILTER_LIST_KEY = 'ApiAdmin:FilterList'; - const APP_LIST_KEY = 'ApiAdmin:AppList'; - const AUTH_LIST_KEY = 'ApiAdmin:AuthList'; - -} \ No newline at end of file diff --git a/application/admin/controller/FilterManager.php b/application/admin/controller/FilterManager.php deleted file mode 100644 index fa66c90..0000000 --- a/application/admin/controller/FilterManager.php +++ /dev/null @@ -1,381 +0,0 @@ -<?php -/** - * 规则组配置 - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -use app\admin\model\Filter; - -class FilterManager extends Base { - public function index(){ - $cacheValue = []; - $data = (new Filter())->where([])->select(); - foreach ( $data as $value ){ - $cacheValue[$value['id']] = $value['name']; - } - cache(CacheType::FILTER_LIST_KEY, $cacheValue); - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '规则组名称' - ], - [ - 'field' => 'month', - 'info' => '次/月' - ], - [ - 'field' => 'day', - 'info' => '次/日' - ], - [ - 'field' => 'hour', - 'info' => '次/时' - ], - [ - 'field' => 'minute', - 'info' => '次/分' - ], - [ - 'field' => 'second', - 'info' => '次/秒' - ], - [ - 'field' => 'status', - 'info' => '状态' - ] - ], - 'topButton' => [ - [ - 'href' => 'FilterManager/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ] - ], - 'rightButton' => [ - [ - 'info' => '启用', - 'href' => 'FilterManager/open', - 'class'=> 'btn-success ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-check', - 'confirm' => 1, - 'show' => ['status', 0] - ], - [ - 'info' => '禁用', - 'href' => 'FilterManager/close', - 'class'=> 'btn-warning ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-close', - 'confirm' => 1, - 'show' => ['status', 1] - ], - [ - 'info' => '编辑', - 'href' => 'FilterManager/edit', - 'class'=> 'btn-primary', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'FilterManager/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'typeRule' => [ - 'status' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '禁用', - 'class' => 'label label-danger' - ], - [ - 'info' => '启用', - 'class' => 'label label-success' - ] - ] - ], - 'month' => [ - 'module' => 'label', - 'rule' => [ - -1 => [ - 'info' => '无限制', - 'class' => 'label label-primary' - ] - ] - ], - 'day' => [ - 'module' => 'label', - 'rule' => [ - -1 => [ - 'info' => '无限制', - 'class' => 'label label-primary' - ] - ] - ], - 'hour' => [ - 'module' => 'label', - 'rule' => [ - -1 => [ - 'info' => '无限制', - 'class' => 'label label-primary' - ] - ] - ], - 'second' => [ - 'module' => 'label', - 'rule' => [ - -1 => [ - 'info' => '无限制', - 'class' => 'label label-primary' - ] - ] - ], - 'minute' => [ - 'module' => 'label', - 'rule' => [ - -1 => [ - 'info' => '无限制', - 'class' => 'label label-primary' - ] - ] - ] - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function add(){ - if( $this->request->isPost() ){ - $userModel = new Filter(); - $result = $userModel->allowField(true)->save($this->request->post()); - if(false === $result){ - $this->error($userModel->getError()); - }else{ - $this->success('操作成功!', url('FilterManager/index')); - } - }else{ - $form = [ - 'formTitle' => $this->menuInfo['name'].'【请注意规则的合理性】', - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('FilterManager/add'), - 'formId' => 'add-FilterManager-form', - 'backUrl' => url('FilterManager/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '规则组名称', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每月请求频率:', - 'attr' => [ - 'name' => 'month', - 'value' => '-1', - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每日请求频率:', - 'attr' => [ - 'name' => 'day', - 'value' => '-1', - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每小时请求频率:', - 'attr' => [ - 'name' => 'hour', - 'value' => '-1', - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每分钟请求频率:', - 'attr' => [ - 'name' => 'minute', - 'value' => '-1', - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每秒请求频率:', - 'attr' => [ - 'name' => 'second', - 'value' => '-1', - 'placeholder' => '-1' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $delNum = Filter::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('FilterManager/index')); - } - } - $this->error('操作失败!'); - } - - public function edit(){ - if( $this->request->isPut() ){ - $data = $this->request->put(); - $keysModel = new Filter(); - $keysModel->allowField(true)->update($data); - $this->success('操作成功!', url('FilterManager/index')); - }else{ - $detail = Filter::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('FilterManager/edit'), - 'formId' => 'edit-FilterManager-form', - 'backUrl' => url('FilterManager/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '规则组名称', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每月请求频率:', - 'attr' => [ - 'name' => 'month', - 'value' => $detail['month'], - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每日请求频率:', - 'attr' => [ - 'name' => 'day', - 'value' => $detail['day'], - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每小时请求频率:', - 'attr' => [ - 'name' => 'hour', - 'value' => $detail['hour'], - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每分钟请求频率:', - 'attr' => [ - 'name' => 'minute', - 'value' => $detail['minute'], - 'placeholder' => '-1' - ] - ], - [ - 'module' => 'text', - 'description' => '请填写整数,-1表示不限制', - 'info' => '每秒请求频率:', - 'attr' => [ - 'name' => 'second', - 'value' => $detail['second'], - 'placeholder' => '-1' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function open(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $keysObj = Filter::get([$this->primaryKey => $id]); - if( is_null($keysObj) ){ - $this->error('当前规则组不存在',''); - }else{ - $keysObj->status = 1; - $keysObj->save(); - $this->success('操作成功', url('FilterManager/index')); - } - } - } - - public function close(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $keysObj = Filter::get([$this->primaryKey => $id]); - if( is_null($keysObj) ){ - $this->error('当前规则组不存在',''); - }else{ - $keysObj->status = 0; - $keysObj->save(); - $this->success('操作成功', url('FilterManager/index')); - } - } - } -} \ No newline at end of file diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php deleted file mode 100644 index 319af6e..0000000 --- a/application/admin/controller/Index.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -namespace app\admin\controller; - -use app\admin\model\Menu; - -class Index extends Base { - public function index() { - $dataObj = Menu::all(function($query){ - $query->order('sort', 'asc'); - }); - $authList = (new \Permission())->getAuthList($this->uid); - foreach ($dataObj as $value){ - if( !$value->hide ){ - if( isAdministrator() ){ - $data[] = $value->toArray(); - }else{ - if( (isset($authList[$value->url]) && $authList[$value->url]) || empty($value->url) ){ - $data[] = $value->toArray(); - } - } - } - } - $data = listToTree($data); - $this->assign('title', '首页'); - $this->assign('menuData', $data); - $this->assign('userInfo', $this->userInfo); - return $this->fetch(); - } -} diff --git a/application/admin/controller/KeyManager.php b/application/admin/controller/KeyManager.php deleted file mode 100644 index 9216295..0000000 --- a/application/admin/controller/KeyManager.php +++ /dev/null @@ -1,334 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -use app\admin\model\Keys; - -class KeyManager extends Base { - - private $apps; - private $filters; - - public function _myInitialize() { - $this->apps = cache(CacheType::APP_LIST_KEY); - if( !$this->apps ){ - $this->error('请先配置应用!', url('AppManager/index')); - }else{ - $this->apps = [0 => '不关联'] + $this->apps; - } - $this->filters = [-1 => '不限制'] + cache(CacheType::FILTER_LIST_KEY); - } - - public function index(){ - $data = Keys::all(); - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'description', - 'info' => '秘钥描述' - ], - [ - 'field' => 'appId', - 'info' => '适配APP' - ], - [ - 'field' => 'filterId', - 'info' => '适配过滤组' - ], - [ - 'field' => 'addTime', - 'info' => '创建时间' - ], - [ - 'field' => 'status', - 'info' => '状态' - ] - ], - 'topButton' => [ - [ - 'href' => 'KeyManager/add', - 'class'=> 'btn-success', - 'info'=> '创建', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ] - ], - 'rightButton' => [ - [ - 'info' => '启用', - 'href' => 'KeyManager/open', - 'class'=> 'btn-success ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-check', - 'confirm' => 1, - 'show' => ['status', 0] - ], - [ - 'info' => '禁用', - 'href' => 'KeyManager/close', - 'class'=> 'btn-warning ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-close', - 'confirm' => 1, - 'show' => ['status', 1] - ], - [ - 'info' => '编辑', - 'href' => 'KeyManager/edit', - 'class'=> 'btn-primary', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'KeyManager/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'typeRule' => [ - 'addTime' => [ - 'module' => 'date', - ], - 'status' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '禁用', - 'class' => 'label label-danger' - ], - [ - 'info' => '启用', - 'class' => 'label label-success' - ] - ] - ], - 'filterId' => [ - 'module' => 'listValue', - 'rule' => $this->filters - ], - 'appId' => [ - 'module' => 'listValue', - 'rule' => $this->apps - ] - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function add(){ - if( $this->request->isPost() ){ - $userModel = new Keys(); - $result = $userModel->allowField(true)->save($this->request->post()); - if(false === $result){ - $this->error($userModel->getError()); - }else{ - $this->success('操作成功!', url('KeyManager/index')); - } - }else{ - $sk = \StrOrg::randString(64); - $ak = \StrOrg::keyGen(); - $form = [ - 'formTitle' => $this->menuInfo['name'].'【为了API安全,请定期更换Key】', - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('KeyManager/add'), - 'formId' => 'add-KeyManager-form', - 'backUrl' => url('KeyManager/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '秘钥为系统自动生成,并且不可修改', - 'info' => 'AccessKey:', - 'attr' => [ - 'name' => 'accessKey', - 'value' => $ak, - 'placeholder' => '', - 'readOnly' => true - ] - ], - [ - 'module' => 'text', - 'description' => '秘钥为系统自动生成,并且不可修改', - 'info' => 'SecretKey:', - 'attr' => [ - 'name' => 'secretKey', - 'value' => $sk, - 'placeholder' => '', - 'readOnly' => true - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '适配APP:', - 'attr' => [ - 'name' => 'appId', - 'value' => '', - 'options' => $this->apps - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '适配过滤组:', - 'attr' => [ - 'name' => 'filterId', - 'value' => '', - 'options' => $this->filters - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '秘钥描述:', - 'attr' => [ - 'name' => 'description', - 'value' => '', - 'placeholder' => '秘钥的说明,请尽可能的简短清晰!' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $delNum = Keys::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('KeyManager/index')); - } - } - $this->error('操作失败!'); - } - - public function edit(){ - if( $this->request->isPut() ){ - $data = $this->request->put(); - $keysModel = new Keys(); - $keysModel->allowField(true)->update($data); - $this->success('操作成功!', url('KeyManager/index')); - }else{ - $detail = Keys::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('KeyManager/edit'), - 'formId' => 'edit-keyManager-form', - 'backUrl' => url('KeyManager/index'), - ], - 'formList' => [ - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '秘钥为系统自动生成,并且不可修改', - 'info' => 'AccessKey:', - 'attr' => [ - 'name' => 'accessKey', - 'value' => $detail['accessKey'], - 'placeholder' => '', - 'readOnly' => true - ] - ], - [ - 'module' => 'text', - 'description' => '秘钥为系统自动生成,并且不可修改', - 'info' => 'SecretKey:', - 'attr' => [ - 'name' => 'secretKey', - 'value' => $detail['secretKey'], - 'placeholder' => '', - 'readOnly' => true - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '适配APP:', - 'attr' => [ - 'name' => 'appId', - 'value' => $detail['appId'], - 'options' => $this->apps - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '适配过滤组:', - 'attr' => [ - 'name' => 'filterId', - 'value' => $detail['filterId'], - 'options' => $this->filters - ] - ], - [ - 'module' => 'textarea', - 'description' => '', - 'info' => '秘钥描述:', - 'attr' => [ - 'name' => 'description', - 'value' => $detail['description'], - 'placeholder' => '秘钥的说明,请尽可能的简短清晰!' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function open(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $keysObj = Keys::get([$this->primaryKey => $id]); - if( is_null($keysObj) ){ - $this->error('当前秘钥不存在',''); - }else{ - $keysObj->status = 1; - $keysObj->save(); - $this->success('操作成功', url('KeyManager/index')); - } - } - } - - public function close(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $keysObj = Keys::get([$this->primaryKey => $id]); - if( is_null($keysObj) ){ - $this->error('当前秘钥不存在',''); - }else{ - $keysObj->status = 0; - $keysObj->save(); - $this->success('操作成功', url('KeyManager/index')); - } - } - } -} \ No newline at end of file diff --git a/application/admin/controller/Menu.php b/application/admin/controller/Menu.php deleted file mode 100644 index 2a44d26..0000000 --- a/application/admin/controller/Menu.php +++ /dev/null @@ -1,520 +0,0 @@ -<?php -namespace app\admin\controller; -use think\Validate; - -/** - * 菜单管理控制器 - * @since 2016-11-16 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ -class Menu extends Base { - - public function index(){ - $data = []; - $dataObj = \app\admin\model\Menu::all(function($query){ - $query->order('sort', 'asc'); - }); - foreach ($dataObj as $value){ - $dataArr = $value->toArray(); - if( $dataArr['url'] ){ - $dataArr['token'] = url($dataArr['url']); - }else{ - $dataArr['token'] = ''; - } - $data[] = $dataArr; - } - $data = formatTree(listToTree($data)); - (new Auth())->refreshAuth($data); - foreach( $data as &$value ){ - $value['name'] = $value['showName']; - unset($value['showName']); - unset($value['namePrefix']); - unset($value['lv']); - unset($value['token']); - $value['post'] = intval(boolval($value['auth'] & \Permission::AUTH_POST)); - $value['get'] = intval(boolval($value['auth'] & \Permission::AUTH_GET)); - $value['put'] = intval(boolval($value['auth'] & \Permission::AUTH_PUT)); - $value['delete'] = intval(boolval($value['auth'] & \Permission::AUTH_DELETE)); - } - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'name', - 'info' => '菜单名称' - ], - [ - 'field' => 'url', - 'info' => '菜单URL' - ], - [ - 'field' => 'level', - 'info' => '等级' - ], - [ - 'field' => 'get', - 'info' => 'Get' - ], - [ - 'field' => 'put', - 'info' => 'Put' - ], - [ - 'field' => 'post', - 'info' => 'Post' - ], - [ - 'field' => 'delete', - 'info' => 'Delete' - ], - [ - 'field' => 'hide', - 'info' => '隐藏' - ], - [ - 'field' => 'sort', - 'info' => '排序' - ] - ], - 'topButton' => [ - [ - 'href' => 'Menu/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ], - [ - 'href' => 'Menu/del', - 'class'=> 'btn-danger ajax-delete', - 'info'=> '删除', - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'rightButton' => [ - [ - 'info' => '编辑', - 'href' => 'Menu/edit', - 'class'=> 'btn-warning', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-pencil', - 'confirm' => 0, - 'show' => '' - ], - [ - 'info' => '删除', - 'href' => 'Menu/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - 'show' => '' - ] - ], - 'typeRule' => [ - 'name' => [ - 'module' => 'a', - 'rule' => [ - 'info' => '', - 'href' => url('Menu/add'), - 'param'=> [$this->primaryKey], - 'class' => 'refresh' - ] - ], - 'hide' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '显示', - 'class' => 'label label-success' - ], - [ - 'info' => '隐藏', - 'class' => 'label label-warning' - ] - ] - ], - 'post' => [ - 'module' => 'icon', - 'rule' => [ - [ - 'info' => '', - 'class' => 'fa fa-close' - ], - [ - 'info' => '', - 'class' => 'fa fa-check' - ] - ] - ], - 'get' => [ - 'module' => 'icon', - 'rule' => [ - [ - 'info' => '', - 'class' => 'fa fa-close' - ], - [ - 'info' => '', - 'class' => 'fa fa-check' - ] - ] - ], - 'put' => [ - 'module' => 'icon', - 'rule' => [ - [ - 'info' => '', - 'class' => 'fa fa-close' - ], - [ - 'info' => '', - 'class' => 'fa fa-check' - ] - ] - ], - 'delete' => [ - 'module' => 'icon', - 'rule' => [ - [ - 'info' => '', - 'class' => 'fa fa-close' - ], - [ - 'info' => '', - 'class' => 'fa fa-check' - ] - ] - ] - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function add(){ - if( $this->request->isPost() ){ - $menuModel = new \app\admin\model\Menu(); - $result = $menuModel->allowField(true)->validate( - [ - 'name' => 'require', - ],[ - 'name.require' => '菜单名称不能为空', - ] - )->save($this->request->post()); - if(false === $result){ - $this->error($menuModel->getError()); - }else{ - $this->success('操作成功!', url('Menu/index')); - } - }else{ - $dataObj = \app\admin\model\Menu::all(function($query){ - $query->order('sort', 'asc'); - }); - foreach ($dataObj as $value){ - $data[] = $value->toArray(); - } - $data = formatTree(listToTree($data)); - foreach( $data as &$value ){ - $value['name'] = $value['showName']; - unset($value['showName']); - unset($value['namePrefix']); - unset($value['lv']); - } - $data = array_column($data, 'name', $this->primaryKey); - $defaultFather = $this->request->get($this->primaryKey); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('Menu/add'), - 'formId' => 'add-menu-form', - 'backUrl' => url('Menu/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '菜单名称:', - 'attr' => [ - 'name' => 'name', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '父级菜单:', - 'attr' => [ - 'name' => 'fid', - 'value' => $defaultFather, - 'options' => $data - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '菜单等级:', - 'attr' => [ - 'name' => 'level', - 'value' => '', - 'options' => [ - '普通认证', - 'Log记录' - ] - ] - ], - [ - 'module' => 'checkbox', - 'description' => '', - 'info' => '访客权限:', - 'attr' => [ - [ - 'name' => 'auth[get]', - 'desc' => 'GET', - 'value' => '' - ], - [ - 'name' => 'auth[put]', - 'desc' => 'PUT', - 'value' => '' - ], - [ - 'name' => 'auth[post]', - 'desc' => 'POST', - 'value' => '' - ], - [ - 'name' => 'auth[delete]', - 'desc' => 'DELETE', - 'value' => '' - ] - ] - ], - [ - 'module' => 'radio', - 'description' => '', - 'info' => '是否显示:', - 'attr' => [ - 'name' => 'hide', - 'value' => '', - 'options' => [ - '显示菜单', - '隐藏菜单', - ] - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '菜单图标:', - 'attr' => [ - 'name' => 'icon', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '菜单URL:[具体格式为:控制器/方法名]', - 'attr' => [ - 'name' => 'url', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '排序:「数字越小顺序越靠前」', - 'attr' => [ - 'name' => 'sort', - 'value' => '0', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function edit(){ - if( $this->request->isPut() ){ - $data = $this->request->put(); - $validate = new Validate([ - 'name' => 'require', - ],[ - 'name.require' => '菜单名称不能为空', - ]); - if(!$validate->check($data)){ - $this->error($validate->getError()); - }else{ - $menuModel = new \app\admin\model\Menu(); - $menuModel->allowField(true)->update($data); - $this->success('操作成功!', url('Menu/index')); - } - }else{ - $dataObj = \app\admin\model\Menu::all(function($query){ - $query->order('sort', 'asc'); - }); - foreach ($dataObj as $value){ - $data[] = $value->toArray(); - } - $data = formatTree(listToTree($data)); - foreach( $data as &$value ){ - $value['name'] = $value['showName']; - unset($value['showName']); - unset($value['namePrefix']); - unset($value['lv']); - } - $data = array_column($data, 'name', $this->primaryKey); - $detail = \app\admin\model\Menu::get($this->request->get($this->primaryKey))->toArray(); - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('Menu/edit'), - 'formId' => 'edit-menu-form', - 'backUrl' => url('Menu/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '菜单名称:', - 'attr' => [ - 'name' => 'name', - 'value' => $detail['name'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'hidden', - 'description' => '', - 'info' => '', - 'attr' => [ - 'name' => $this->primaryKey, - 'value' => $detail[$this->primaryKey], - 'placeholder' => '' - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '父级菜单:', - 'attr' => [ - 'name' => 'fid', - 'value' => $detail['fid'], - 'options' => $data - ] - ], - [ - 'module' => 'select', - 'description' => '', - 'info' => '菜单等级:', - 'attr' => [ - 'name' => 'level', - 'value' => $detail['level'], - 'options' => [ - '普通认证', - 'Log记录' - ] - ] - ], - [ - 'module' => 'checkbox', - 'description' => '', - 'info' => '访客权限:', - 'attr' => [ - [ - 'name' => 'auth[get]', - 'desc' => 'GET', - 'value' => $detail['auth'] & \Permission::AUTH_GET - ], - [ - 'name' => 'auth[put]', - 'desc' => 'PUT', - 'value' => $detail['auth'] & \Permission::AUTH_PUT - ], - [ - 'name' => 'auth[post]', - 'desc' => 'POST', - 'value' => $detail['auth'] & \Permission::AUTH_POST - ], - [ - 'name' => 'auth[delete]', - 'desc' => 'DELETE', - 'value' => $detail['auth'] & \Permission::AUTH_DELETE - ] - ] - ], - [ - 'module' => 'radio', - 'description' => '', - 'info' => '是否显示:', - 'attr' => [ - 'name' => 'hide', - 'value' => $detail['hide'], - 'options' => [ - '显示菜单', - '隐藏菜单', - ] - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '菜单图标:', - 'attr' => [ - 'name' => 'icon', - 'value' => $detail['icon'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '菜单URL:[具体格式为:控制器/方法名]', - 'attr' => [ - 'name' => 'url', - 'value' => $detail['url'], - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '排序:「数字越小顺序越靠前」', - 'attr' => [ - 'name' => 'sort', - 'value' => $detail['sort'], - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - $childNum = \app\admin\model\Menu::where(['fid' => $key])->count(); - if( $childNum ){ - $this->error('当前菜单存在子菜单,删除失败!'); - } - $delNum = \app\admin\model\Menu::destroy($key); - if( $delNum ){ - $this->success('操作成功!', url('Menu/index')); - } - } - $this->error('操作失败!'); - } - -} \ No newline at end of file diff --git a/application/admin/controller/PublicShow.php b/application/admin/controller/PublicShow.php deleted file mode 100644 index ec81573..0000000 --- a/application/admin/controller/PublicShow.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -class PublicShow extends Base { - - public function show_404(){ - if( !$this->request->isAjax() ){ - $this->assign('title', '页面丢失了!'); - return $this->fetch('public/404'); - }else{ - $this->error('页面不存在!'); - } - } - - public function show_500(){ - return $this->fetch('public/500'); - } -} \ No newline at end of file diff --git a/application/admin/controller/ReturnCode.php b/application/admin/controller/ReturnCode.php deleted file mode 100644 index 34b2dc5..0000000 --- a/application/admin/controller/ReturnCode.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -class ReturnCode { - - const GET_TEMPLATE_SUCCESS = 200; - const SUCCESS = 1; - const ERROR = 0; - const GET_TEMPLATE_ERROR = 404; - - const ERROR_BY_REFRESH_PAGE = 302; - - -} \ No newline at end of file diff --git a/application/admin/controller/User.php b/application/admin/controller/User.php deleted file mode 100644 index bc046fe..0000000 --- a/application/admin/controller/User.php +++ /dev/null @@ -1,368 +0,0 @@ -<?php -/** - * 用户登录类 - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -use app\admin\model\AuthGroupAccess; -use app\admin\model\UserData; - -class User extends Base { - - public function index(){ - $data = []; - $dataObj = \app\admin\model\User::all(); - foreach ( $dataObj as $value ){ - $userInfo = $value->toArray(); - $userData = UserData::get(['uid' => $userInfo[$this->primaryKey]]); - if( !is_null($userData) ){ - $userData->toArray(); - $userInfo['loginTimes'] = $userData['loginTimes']; - $userInfo['lastLoginTime'] = $userData['lastLoginTime']; - $userInfo['lastLoginIp'] = $userData['lastLoginIp']; - }else{ - $userInfo['loginTimes'] = 0; - $userInfo['lastLoginTime'] = 0; - $userInfo['lastLoginIp'] = 0; - } - $data[] = $userInfo; - } - $table = [ - 'tempType' => 'table', - 'header' => [ - [ - 'field' => 'username', - 'info' => '用户账号' - ], - [ - 'field' => 'nickname', - 'info' => '用户昵称' - ], - [ - 'field' => 'loginTimes', - 'info' => '登录次数' - ], - [ - 'field' => 'lastLoginTime', - 'info' => '最后登录时间' - ], - [ - 'field' => 'lastLoginIp', - 'info' => '最后登录IP' - ], - [ - 'field' => 'status', - 'info' => '状态' - ] - ], - 'topButton' => [ - [ - 'href' => 'User/add', - 'class'=> 'btn-success', - 'info'=> '新增', - 'icon' => 'fa fa-plus', - 'confirm' => 0, - ] - ], - 'rightButton' => [ - [ - 'info' => '启用', - 'href' => 'User/open', - 'class'=> 'btn-success ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-check', - 'confirm' => 1, - 'show' => ['status', 0] - ], - [ - 'info' => '禁用', - 'href' => 'User/close', - 'class'=> 'btn-warning ajax-put-url', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-close', - 'confirm' => 1, - 'show' => ['status', 1] - ], - [ - 'info' => '授权', - 'href' => 'Auth/group', - 'class'=> 'btn-default', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-lock', - 'confirm' => 0, - ], - [ - 'info' => '删除', - 'href' => 'User/del', - 'class'=> 'btn-danger ajax-delete', - 'param'=> [$this->primaryKey], - 'icon' => 'fa fa-trash', - 'confirm' => 1, - ] - ], - 'typeRule' => [ - 'lastLoginTime' => [ - 'module' => 'date', - ], - 'status' => [ - 'module' => 'label', - 'rule' => [ - [ - 'info' => '禁用', - 'class' => 'label label-danger' - ], - [ - 'info' => '启用', - 'class' => 'label label-success' - ] - ] - ] - ], - 'data' => $data - ]; - $table = $this->_prepareTemplate($table); - $this->result($table, ReturnCode::GET_TEMPLATE_SUCCESS); - } - - public function open(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - $userObj = \app\admin\model\User::get([$this->primaryKey => $id]); - if( is_null($userObj) ){ - $this->error('用户不存在',''); - }else{ - $userObj->status = 1; - $userObj->save(); - $this->success('操作成功', url('User/index')); - } - } - } - - public function close(){ - if( $this->request->isPut() ){ - $id = $this->request->put($this->primaryKey); - if(!isAdministrator($id)){ - $userObj = \app\admin\model\User::get([$this->primaryKey => $id]); - if( is_null($userObj) ){ - $this->error('用户不存在',''); - }else{ - $userObj->status = 0; - $userObj->save(); - $this->success('操作成功', url('User/index')); - } - }else{ - $this->error('管理员不能被禁用',''); - } - } - } - - /** - * 用户登录函数 - * @return mixed|void - */ - public function login(){ - if( $this->request->isPost() ){ - $username = $this->request->post('username'); - $password = $this->request->post('password'); - if( !$username || !$password ){ - $this->error('缺少关键数据!',''); - } - $userModel = new \app\admin\model\User(); - $password = $userModel->getPwdHash($password); - $userInfo = $userModel->where(['username' => $username, 'password' => $password])->find(); - if( empty($userInfo) ){ - $this->error('用户名或者密码错误!',''); - }else{ - if( $userInfo['status'] ){ - //保存用户信息和登录凭证 - session('uid', $userInfo[$this->primaryKey]); - cache($userInfo[$this->primaryKey], session_id(), config('online_time')); - //获取跳转链接,做到从哪来到哪去 - if( $this->request->has('from', 'get') ){ - $url = $this->request->get('from'); - }else{ - $url = url('Index/index'); - } - //更新用户数据 - $userData = UserData::get(['uid' => $userInfo[$this->primaryKey]]); - if( $userData ){ - $userData->loginTimes += 1; - $userData->save(); - }else{ - $newUserData = new UserData(); - $newUserData->loginTimes = 1; - $newUserData->uid = $userInfo[$this->primaryKey]; - $newUserData->save(); - } - $this->success('登录成功', $url); - }else{ - $this->error('用户已被封禁,请联系管理员',''); - } - } - }else{ - return $this->fetch(); - } - } - - public function logout(){ - cache(session('uid'), null); - session('uid', null); - $this->success('登出成功',url('User/login')); - } - - public function add(){ - if( $this->request->isPost() ){ - $userModel = new \app\admin\model\User(); - $result = $userModel->allowField(true)->validate( - [ - 'username' => 'require', - ],[ - 'username.require' => '用户名不能为空', - ] - )->save($this->request->post()); - if(false === $result){ - $this->error($userModel->getError()); - }else{ - $this->success('操作成功!', url('User/index')); - } - }else{ - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'add', - 'formAttr' => [ - 'target' => url('User/add'), - 'formId' => 'add-user-form', - 'backUrl' => url('User/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '账户名:', - 'attr' => [ - 'name' => 'username', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '用户昵称:', - 'attr' => [ - 'name' => 'nickname', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'password', - 'description' => '', - 'info' => '用户密码[默认:123123]:', - 'attr' => [ - 'name' => 'password', - 'value' => '123123', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } - - public function del(){ - if( $this->request->isDelete() ){ - $key = $this->request->delete($this->primaryKey); - if(!isAdministrator($key)){ - $delNum = \app\admin\model\User::destroy($key); - if( $delNum ){ - UserData::destroy(['uid' => $key]); - AuthGroupAccess::destroy(['uid' => $key]); - $this->success('操作成功!', url('User/index')); - } - }else{ - $this->error('管理员不能被删除!'); - } - } - $this->error('操作失败!'); - } - - public function edit(){ - if( $this->request->isPut() ){ - if( $this->request->put('password') != $this->request->put('repassword') ){ - $this->error('两次密码输入不一致!', ''); - } - if( empty($this->request->put('nickname')) ){ - $this->error('昵称不能为空', ''); - } - $userModel = new \app\admin\model\User(); - $userDetail = $userModel->where([$this->primaryKey => $this->uid])->find(); - if( !empty($this->request->put('password')) ){ - $userDetail->password = $this->request->put('password'); - } - $userDetail->nickname = $this->request->put('nickname'); - $userDetail->save(); - $this->success('操作成功!', url('User/index')); - - }else{ - $form = [ - 'formTitle' => $this->menuInfo['name'], - 'tempType' => 'edit', - 'formAttr' => [ - 'target' => url('User/edit'), - 'formId' => 'edit-user-form', - 'backUrl' => url('User/index'), - ], - 'formList' => [ - [ - 'module' => 'text', - 'description' => '', - 'info' => '账户名:', - 'attr' => [ - 'name' => 'username', - 'value' => $this->userInfo['username'], - 'placeholder' => '', - 'disabled' => true - ] - ], - [ - 'module' => 'text', - 'description' => '', - 'info' => '用户昵称:', - 'attr' => [ - 'name' => 'nickname', - 'value' => $this->userInfo['nickname'], - 'placeholder' => $this->userInfo['nickname'] - ] - ], - [ - 'module' => 'password', - 'description' => '', - 'info' => '新密码:', - 'attr' => [ - 'name' => 'password', - 'value' => '', - 'placeholder' => '' - ] - ], - [ - 'module' => 'password', - 'description' => '', - 'info' => '确认密码:', - 'attr' => [ - 'name' => 'repassword', - 'value' => '', - 'placeholder' => '' - ] - ] - ] - ]; - $this->result($form, ReturnCode::GET_TEMPLATE_SUCCESS); - } - } -} \ No newline at end of file diff --git a/application/admin/controller/WikiManager.php b/application/admin/controller/WikiManager.php deleted file mode 100644 index 6c7fe3b..0000000 --- a/application/admin/controller/WikiManager.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php -/** - * 文档生成引擎 - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\controller; - - -class WikiManager extends Base { - - const FILE_CACHE = 0; - const SERVER_CACHE = 1; - const NO_CACHE = 2; - - private $cacheType; - - public function _myInitialize( $type = '' ) { - if( empty($type) ){ - $this->cacheType = self::FILE_CACHE; - }else{ - $this->cacheType = $type; - } - } - - public function api(){ - - } - - public function app(){ - - } - - private function getWikiToken( $mark ){ - - } - - private function getFileCache( $str ){ - - } - - private function delFileCache( $str ){ - - } - - private function getServerCache( $str ){ - - } - - private function delServerCache( $str ){ - - } -} \ No newline at end of file diff --git a/application/admin/model/Api.php b/application/admin/model/Api.php deleted file mode 100644 index cb411df..0000000 --- a/application/admin/model/Api.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\model; - - -class Api extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/ApiBack.php b/application/admin/model/ApiBack.php deleted file mode 100644 index 83546b1..0000000 --- a/application/admin/model/ApiBack.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/** - * @since 2016-12-12 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\model; - - -class ApiBack extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/ApiFields.php b/application/admin/model/ApiFields.php deleted file mode 100644 index d0031cb..0000000 --- a/application/admin/model/ApiFields.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/** - * @since 2016-12-12 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\model; - - -class ApiFields extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/App.php b/application/admin/model/App.php deleted file mode 100644 index 32c28db..0000000 --- a/application/admin/model/App.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\model; - - -class App extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/AppMember.php b/application/admin/model/AppMember.php deleted file mode 100644 index 0a97978..0000000 --- a/application/admin/model/AppMember.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/** - * @since 2016-11-26 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\model; - - -class AppMember extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/AuthGroup.php b/application/admin/model/AuthGroup.php deleted file mode 100644 index 8904d78..0000000 --- a/application/admin/model/AuthGroup.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\model; - - -class AuthGroup extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/AuthGroupAccess.php b/application/admin/model/AuthGroupAccess.php deleted file mode 100644 index 4a32c6e..0000000 --- a/application/admin/model/AuthGroupAccess.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\model; - - -class AuthGroupAccess extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/AuthRule.php b/application/admin/model/AuthRule.php deleted file mode 100644 index fb4e31b..0000000 --- a/application/admin/model/AuthRule.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\model; - - -class AuthRule extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/Base.php b/application/admin/model/Base.php deleted file mode 100644 index 032be0e..0000000 --- a/application/admin/model/Base.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/** - * @since 2016-11-29 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\model; - - -use think\Model; - -class Base extends Model { - -} \ No newline at end of file diff --git a/application/admin/model/Filter.php b/application/admin/model/Filter.php deleted file mode 100644 index 8454c63..0000000 --- a/application/admin/model/Filter.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/** - * @since 2016-12-01 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\model; - - -class Filter extends Base { - -} \ No newline at end of file diff --git a/application/admin/model/Keys.php b/application/admin/model/Keys.php deleted file mode 100644 index d9d79c2..0000000 --- a/application/admin/model/Keys.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php -/** - * Api访问授权所需要的key - * @since 2016-11-29 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\model; - - -class Keys extends Base { - protected $autoWriteTimestamp = true; - protected $createTime = 'addTime'; - protected $updateTime = false; -} \ No newline at end of file diff --git a/application/admin/model/Menu.php b/application/admin/model/Menu.php deleted file mode 100644 index cbb3471..0000000 --- a/application/admin/model/Menu.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/** - * - * @since 2016-02-18 - * @author zhaoxiang <zhaoxiang051405@outlook.com> - */ - -namespace app\admin\model; - - -class Menu extends Base { - protected $type = [ - 'fid' => 'integer', - 'type' => 'integer', - 'sort' => 'integer', - 'hide' => 'integer', - 'auth' => 'integer', - 'level' => 'integer', - ]; - - protected function setAuthAttr($value){ - if( is_array($value) ){ - $authNum = 0; - if( isset($value['delete']) ){ - $authNum += \Permission::AUTH_DELETE; - } - if( isset($value['put']) ){ - $authNum += \Permission::AUTH_PUT; - } - if( isset($value['get']) ){ - $authNum += \Permission::AUTH_GET; - } - if( isset($value['post']) ){ - $authNum += \Permission::AUTH_POST; - } - return $authNum; - }else{ - return 0; - } - } - -} \ No newline at end of file diff --git a/application/admin/model/User.php b/application/admin/model/User.php deleted file mode 100644 index e503b93..0000000 --- a/application/admin/model/User.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -namespace app\admin\model; - - -class User extends Base { - - protected $autoWriteTimestamp = true; - protected $insert = ['regIp']; - protected $createTime = 'regTime'; - protected $updateTime = 'updateTime'; - - protected function setRegIpAttr(){ - return request()->ip(1); - } - - protected function setPasswordAttr($value) { - return $this->getPwdHash($value); - } - - public function getPwdHash( $pwd, $authKey = '' ){ - $hashKey = empty($authKey)?config('base')['auth_key']:$authKey; - $newPwd = $pwd.$hashKey; - return md5(sha1($newPwd).$hashKey); - } -} \ No newline at end of file diff --git a/application/admin/model/UserData.php b/application/admin/model/UserData.php deleted file mode 100644 index 5e076ba..0000000 --- a/application/admin/model/UserData.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/** - * @since 2016-11-05 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - -namespace app\admin\model; - - -class UserData extends Base { - - protected $insert = ['lastLoginTime', 'lastLoginIp']; - protected $update = ['lastLoginIp', 'lastLoginTime']; - - protected function setLastLoginIpAttr(){ - return request()->ip(1); - } - - protected function getLastLoginIpAttr( $value ){ - return long2ip($value); - } - - protected function setLastLoginTimeAttr(){ - return time(); - } -} \ No newline at end of file diff --git a/application/admin/view/index/index.html b/application/admin/view/index/index.html deleted file mode 100644 index 6f9edd3..0000000 --- a/application/admin/view/index/index.html +++ /dev/null @@ -1,79 +0,0 @@ -{extend name="public/base" /} -{block name="content"} -<div class="box box-success"> - <div class="box-header with-border"> - <h3 class="box-title">新增菜单</h3> - </div> - <form id="form-login"> - <div class="box-body"> - <div> - <div class="col-xs-8 form-group"> - <label for="exampleInputEmail1">Email address</label> - <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email"> - </div> - <div class="col-xs-4 form-group" style="margin-top: 30px"> - <span class="label label-info">Info</span> - </div> - </div> - <div> - <div class="col-xs-8 form-group"> - <label for="exampleInputEmail1">Email address</label> - <select class="form-control"> - <option>option 1</option> - <option>option 2</option> - <option>option 3</option> - <option>option 4</option> - <option>option 5</option> - </select> - </div> - <div class="col-xs-4 form-group" style="margin-top: 30px"> - <span class="label label-info">Info</span> - </div> - </div> - <div> - <div class="col-xs-8 form-group"> - <label for="exampleInputEmail1">Email address</label> - <div class="input-group"> - <span class="input-group-addon"><i class="fa fa-dollar"></i></span> - <input type="text" class="form-control"> - <span class="input-group-addon"><i class="fa fa-ambulance"></i></span> - </div> - </div> - <div class="col-xs-4 form-group" style="margin-top: 30px"> - <span class="label label-info">Info</span> - </div> - </div> - <div> - <div class="form-group col-xs-8"> - <label for="exampleInputEmail1">Email address</label> - <div class="input-group radio"> - <label> - <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked=""> - Option one is this and that—be sure to include why it's great - </label> - <label> - <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked=""> - Option one is this and that—be sure to include why it's great - </label> - <label> - <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked=""> - Option one is this and that—be sure to include why it's great - </label> - </div> - </div> - <div class="col-xs-4 form-group" style="margin-top: 30px"> - <span class="label label-info">Info</span> - </div> - </div> - </div> - <div class="box-footer"> - <button type="submit" target-form="form-login" class="btn btn-primary ajax-post">确认提交</button> - <a class="btn btn-default refe" url="{:url('Menu/index')}" >放弃返回</a> - </div> - </form> -</div> - -{/block} -{block name="myScript"} - -{/block} \ No newline at end of file diff --git a/application/admin/view/public/404.html b/application/admin/view/public/404.html deleted file mode 100644 index 265f81e..0000000 --- a/application/admin/view/public/404.html +++ /dev/null @@ -1,94 +0,0 @@ -{extend name="public/base" /} -{block name="myStyle"} -<style> - div.wrapper404 { - display:block; - width:100%; - text-align:left; - margin:0; - padding:0; - } - - .row2 { - font-size:13px; - font-family:Georgia,"Times New Roman",Times,serif; - color:#919191; - margin:0; - padding:0; - - } - - .row2 a { - color:#F90; - outline:none; - text-decoration:none; - } - - div.wrapper404 h1,div.wrapper404 h2,div.wrapper404 h3,div.wrapper404 h4,div.wrapper404 h5,div.wrapper404 h6 { - font-size:20px; - font-weight:400; - line-height:normal; - margin:0 0 15px; - padding:0; - } - - #fof { - display:block; - width:100%; - line-height:1.6em; - text-align:center; - padding:150px 0; - } - - #fof .hgroup { - margin-bottom:15px; - } - - #fof .hgroup h1,#fof .hgroup h2 { - text-transform:uppercase; - margin:0; - padding:0; - } - - #fof .hgroup h1 { - margin-bottom:15px; - font-size:40px; - } - - #fof .hgroup h2 { - display:inline-block; - font-size:80px; - border:solid #CCC; - text-transform:lowercase; - border-width:1px 0; - padding:0 0 15px; - } - - #fof p { - display:block; - font-size:16px; - margin:15px 0 0; - padding:0; - } - - #fof p:first-child { - margin-top:0; - } -</style> -{/block} -{block name="main"} -<div class="wrapper404 row2"> - <div id="container" class="clear"> - <div id="fof" class="clear"> - <div class="hgroup"> - <h1>糟糕,系统出错了 !</h1> - <h2>404 Error</h2> - </div> - <p>由于一些原因,您访问的网页不存在!</p> - <p><a href="javascript:history.go(-1)">返回</a>上一页 或者 <a href="#">回到首页</a></p> - </div> - </div> -</div> -{/block} -{block name="myScript"} -{/block} \ No newline at end of file diff --git a/application/admin/view/public/500.html b/application/admin/view/public/500.html deleted file mode 100644 index e69de29..0000000 diff --git a/application/admin/view/public/base.html b/application/admin/view/public/base.html deleted file mode 100644 index c3b741e..0000000 --- a/application/admin/view/public/base.html +++ /dev/null @@ -1,200 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <title>{:config('PRODUCT_NAME')} | {block name="title"}{$title}{/block}</title> - <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> - <link rel="stylesheet" href="__PLUGIN__/bootstrap/css/bootstrap.min.css"> - <link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css"> - <link rel="stylesheet" href="//cdn.bootcss.com/ionicons/2.0.1/css/ionicons.min.css"> - <link rel="stylesheet" href="__CSS__/AdminLTE.min.css"> - <link rel="stylesheet" href="__CSS__/skins/_all-skins.min.css"> - <link rel="icon" href="__IMG__/favicon.ico"> - <style> - body{ - font-family: "Microsoft YaHei",FontAwesome,sans-serif; - } - .builder-data-empty { - margin-bottom: 20px; - background-color: #f9f9f9; - } - .no-data { - padding: 130px 0; - color: #555; - } - .am-text-center { - text-align: center !important; - } - a{ - cursor:pointer; - } - </style> - {block name="myStyle"}{/block} - <!--[if lt IE 9]> - <script src="__PLUGIN__/compatible/html5shiv.js"></script> - <script src="__PLUGIN__/compatible/respond.min.js"></script> - <![endif]--> -</head> -<body class="hold-transition skin-blue sidebar-mini fixed"> - <div class="wrapper"> - <!--顶部banner--> - <header class="main-header"> - <a href="{:url('Index/index')}" class="logo" style="height: 52px"> - <span class="logo-mini"> - <img src="__IMG__/logo.jpg" width="51px" alt=""> - </span> - <span class="logo-lg">ApiAdmin</span> - </a> - <nav class="navbar navbar-static-top"> - <a href="javascript:void(0);" class="sidebar-toggle" data-toggle="offcanvas" role="button"> - <span class="sr-only">Toggle navigation</span> - </a> - <div class="navbar-custom-menu"> - <ul class="nav navbar-nav"> - <li class="dropdown user user-menu"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown"> - <img src="__IMG__/logo.jpg" class="user-image" alt="User Image"> - <span class="hidden-xs">{$userInfo['username']}</span> - </a> - <ul class="dropdown-menu"> - <!-- User image --> - <li class="user-header"> - <img src="__IMG__/logo.jpg" class="img-circle" alt="User Image"> - - <p> - {$userInfo['username']} - {$userInfo['nickname']} - <small>注册时间:{$userInfo['regTime'] | date='Y-m-d',###}</small> - </p> - </li> - <!-- Menu Footer--> - <li class="user-footer"> - <div class="pull-left"> - <a url="{:url('User/edit')}" class="refresh btn btn-default btn-flat">修改信息</a> - </div> - <div class="pull-right"> - <a href="{:url('User/logout')}" class="btn btn-default btn-flat">退出登录</a> - </div> - </li> - </ul> - </li> - </ul> - </div> - </nav> - </header> - <!-- 左侧导航栏 --> - <aside class="main-sidebar" id="main-sidebar"> - <section class="sidebar"> - <!--管理员信息--> - <div class="user-panel"> - <div class="pull-left image"> - <img src="__IMG__/logo.jpg" class="img-circle" alt="头像"> - </div> - <div class="pull-left info"> - <p>{$userInfo['nickname']}</p> - <a href="javascript:void(0);"><i class="fa fa-circle text-success"></i> Online</a> - </div> - </div> - <!--搜索表单--> - <form action="#" method="get" class="sidebar-form"> - <div class="input-group"> - <input type="text" name="q" class="form-control" placeholder="Search..."> - <span class="input-group-btn"> - <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> - </span> - </div> - </form> - <ul class="sidebar-menu"> - <li class="header">主菜单</li> - {volist name="menuData" id="menuValue"} - {if condition="!empty($menuValue['url']) OR (isset($menuValue['_child']) AND count($menuValue['_child']))"} - {if condition="isset($menuValue['_child']) AND count($menuValue['_child'])"} - <li class="treeview"> - <a href="javascript:void(0);"> - <i class="fa {$menuValue['icon']}"></i> <span class="menuFather">{$menuValue['name']}</span> - <span class="pull-right-container"> - <i class="fa fa-angle-left pull-right"></i> - </span> - </a> - <ul class="treeview-menu"> - {volist name="menuValue['_child']" id="childValue"} - <li class="menuChild"><a url="{:url($childValue['url'])}" class="refresh"><i class="fa {$childValue['icon']}"></i> {$childValue['name']}</a></li> - {/volist} - </ul> - </li> - {else /} - <li> - <a url="{:url($menuValue['url'])}" class="refresh"> - <i class="fa {$menuValue['icon']}"></i> <span class="menuFather">{$menuValue['name']}</span> - </a> - </li> - {/if} - {/if} - {/volist} - </ul> - </section> - </aside> - - <div class="content-wrapper"> - <!-- 头部(面包屑导航) --> - <section class="content-header" id="content-header"> - <h1>{$title}</h1> - <ol class="breadcrumb" id="breadcrumb"> - <li><i class="fa fa-dashboard"></i> 首页</li> - </ol> - </section> - <section class="content" id="content"> - {block name="content"}{/block} - </section> - </div> - - <!-- 公用底部(完成适配) --> - <footer class="main-footer"> - <div class="pull-right hidden-xs"> - <b>Version</b> {:config('PRODUCT_VERSION')} - </div> - <strong>Copyright © 2014-{:date('Y')} <a href="{:config('WEBSITE_DOMAIN')}">{:config('COMPANY_NAME')}</a>.</strong> All rights reserved. - </footer> - <!-- 主题适配相关(完成适配) --> - <div class="control-sidebar-bg"></div> - </div> - <!-- jQuery 2.2.3 --> - <script src="__PLUGIN__/jQuery/2.2.4/jquery.min.js"></script> - <!-- Bootstrap 3.3.6 --> - <script src="__PLUGIN__/bootstrap/js/bootstrap.min.js"></script> - <!-- FastClick --> - <script src="__PLUGIN__/fastClick/fastclick.js"></script> - <!-- slimScroll --> - <script src="__PLUGIN__/slimScroll/jquery.slimscroll.min.js"></script> - <!-- BootBox --> - <script src="__PLUGIN__/bootBox/bootbox.min.js"></script> - <!-- AdminLTE App --> - <script src="__JS__/app.min.js"></script> - <!-- AdminLTE for demo purposes --> - <script src="__JS__/demo.js"></script> - <script> - var JS_PATH = '__JS__'; - var CSS_PATH = '__CSS__'; - var STATIC_PATH = '__STATIC__'; - var IMG_PATH = '__IMG__'; - var PLUGIN_PATH = '__PLUGIN__'; - var COMPANY_NAME = '{:config("COMPANY_NAME")}'; - - /** - * 自动适配面包屑导航 - */ - $('body').on('click', '.menuChild', function() { - $('.menuChild').removeClass('active'); - $(this).addClass('active'); - var parentName = $.trim($(this).parent().prev().text()); - var ownName = $(this).children('a').text(); - var breadcrumb = $('#breadcrumb'); - breadcrumb.html('<li><i class="fa fa-dashboard"></i> 首页</li>'); - breadcrumb.append('<li>'+ parentName +'</li><li>'+ ownName +'</li>'); - breadcrumb.prev().text(ownName); - }); - </script> - <script src="__JS__/template.js"></script> - {block name="myScript"}{/block} -</body> -</html> diff --git a/application/admin/view/public/jump.html b/application/admin/view/public/jump.html deleted file mode 100644 index 7460f53..0000000 --- a/application/admin/view/public/jump.html +++ /dev/null @@ -1,63 +0,0 @@ -{__NOLAYOUT__} -<!doctype html> -<html lang="zh"> -<head> - <meta charset="UTF-8"> - <title>ApiAdmin - 跳转提示</title> - <script src="__PLUGIN__/jQuery/3.1.1/jquery.min.js"></script> - <link href="//cdn.bootcss.com/semantic-ui/2.2.6/semantic.min.css" rel="stylesheet"> - <script src="//cdn.bootcss.com/semantic-ui/2.2.6/semantic.js"></script> - <link rel="icon" href="__IMG__/favicon.ico"> -</head> -<body> - -<div class="ui card" style="text-align:center;width:40%;position: fixed;top: 20%;left: 30%"> - <?php switch ($code) {?> - <?php case 1:?> - <div class="ui green inverted segment" style="margin: 0px;"> - <i class="ui smile icon massive"></i> - </div> - <?php break;?> - <?php case 0:?> - <div class="ui red inverted segment" style="margin: 0px;"> - <i class="ui frown icon massive"></i> - </div> - <?php break;?> - <?php } ?> - <div class="content" style="line-height: 2em"> - <?php if(isset($msg)) {?> - <span class="header"><?php echo(strip_tags($msg));?></span> - <?php }else{?> - <span class="header"><?php echo($error); ?></span> - <?php }?> - <div class="meta"> - 将在<span id="left"><?php echo($wait); ?></span>S后自动跳转 - </div> - </div> - <span style="display: none" id="href"><?php echo($url); ?></span> - <div class="ui bottom attached indicating progress" id="amanege-bar"> - <div class="bar"></div> - </div> -</div> -</body> -<script type="text/javascript"> - (function(){ - var wait = 0,left = $('#left').text(); - var href = $('#href').text(); - var each = 100/left; - var interval = setInterval(function(){ - wait = wait + each; - left = left - 1; - if(wait > 100) { - location.href = href; - clearInterval(interval); - return ; - } - $('#left').text(left); - $('#amanege-bar').progress({ - percent: wait - }); - }, 1000); - })(); -</script> -</html> \ No newline at end of file diff --git a/application/admin/view/user/login.html b/application/admin/view/user/login.html deleted file mode 100644 index f80813d..0000000 --- a/application/admin/view/user/login.html +++ /dev/null @@ -1,63 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <title>{:config('PRODUCT_NAME')} | 登 录</title> - <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> - <link rel="stylesheet" href="__PLUGIN__/bootstrap/css/bootstrap.min.css"> - <link rel="stylesheet" href="__CSS__/AdminLTE.min.css"> - <link rel="icon" href="__IMG__/favicon.ico"> - <!--[if lt IE 9]> - <script src="__PLUGIN__/compatible/html5shiv.min.js"></script> - <script src="__PLUGIN__/compatible/respond.min.js"></script> - <![endif]--> -</head> -<body class="hold-transition login-page"> -<div class="login-box"> - <div class="login-logo"> - <a href="{:config('WEBSITE_DOMAIN')}"><b>Api</b> Admin</a> - </div> - <div class="login-box-body"> - <p class="login-box-msg"> - <span class="label label-info">请填写您的账号和密码(test/112233)</span> - <!--<span class="label label-danger">系统升级中...尝试使用Element-UI</span>--> - </p> - - <form action="{:url('User/login')}" id="form-login"> - <div class="form-group has-feedback"> - <input type="text" class="form-control" name="username" placeholder="Username"> - <span class="glyphicon glyphicon-user form-control-feedback"></span> - </div> - <div class="form-group has-feedback"> - <input type="password" name="password" class="form-control" placeholder="Password"> - <span class="glyphicon glyphicon-lock form-control-feedback"></span> - </div> - <div class="row"> - <div class="col-xs-12"> - <button type="submit" target-form="form-login" class="btn btn-primary ajax-post redirect btn-block btn-flat">登 录</button> - </div> - </div> - <div style="padding-top: 15px;padding-bottom: 15px"> - <div style="float: left"> - <script src='//git.oschina.net/xiaoxunzhao/ApiAdmin/star_widget_preview'></script> - </div> - <div style="float: right"> - <a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=602d03f33a231ae1381432d750d26e6ca1de2ef7eb60116f4bbda1547445f9c5"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="ApiAdmin交流群" title="ApiAdmin交流群"></a> - </div> - </div> - </form> - </div> -</div> - -<!-- jQuery 2.2.3 --> -<script src="__PLUGIN__/jQuery/2.2.4/jquery.min.js"></script> -<!-- Bootstrap 3.3.6 --> -<script src="__PLUGIN__/bootstrap/js/bootstrap.min.js"></script> -<!-- BootBox --> -<script src="__PLUGIN__/bootBox/bootbox.min.js"></script> - -<script src="__JS__/template.js"></script> - -</body> -</html> diff --git a/application/build.php b/application/build.php deleted file mode 100644 index c0147d8..0000000 --- a/application/build.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -return [ - // 生成应用公共文件 - '__file__' => ['common.php', 'config.php', 'database.php'], - - // 定义demo模块的自动生成 (按照实际定义的文件名生成) - 'admin' => [ - '__file__' => ['common.php'], - '__dir__' => ['behavior', 'controller', 'model', 'view'], - 'controller' => ['Index', 'Test', 'UserType'], - 'model' => ['User', 'UserType'], - 'view' => ['index/index'], - ], - // 其他更多的模块定义 -]; diff --git a/application/command.php b/application/command.php deleted file mode 100644 index 3f91003..0000000 --- a/application/command.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -return []; \ No newline at end of file diff --git a/application/config.php b/application/config.php deleted file mode 100644 index 9b9c8a5..0000000 --- a/application/config.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -return [ - 'PRODUCT_VERSION' => 'V1.2.0', //项目版本 - 'PRODUCT_NAME' => 'ApiAdmin', //产品名称 - 'WEBSITE_DOMAIN' => 'http://zxblog.our-dream.cn', //官方网址 - 'COMPANY_NAME' => 'ApiAdmin开发维护团队', //公司名称 - 'SQL_PRIMARY_KEY' => 'id', - - // 应用调试模式 - 'app_debug' => true, - // 应用Trace - 'app_trace' => false, - - // 视图输出字符串内容替换 - 'view_replace_str' => [ - '__STATIC__'=>'/static', - '__CSS__'=>'/static/css', - '__JS__'=>'/static/js', - '__IMG__'=>'/static/img', - '__PLUGIN__'=>'/static/plugin', - ], - // 默认跳转页面对应的模板文件 - 'dispatch_success_tmpl' => 'public/jump', - 'dispatch_error_tmpl' => 'public/jump', -]; diff --git a/application/install/common.php b/application/install/common.php deleted file mode 100644 index 34d0787..0000000 --- a/application/install/common.php +++ /dev/null @@ -1,307 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | CoreThink [ Simple Efficient Excellent ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2014 http://www.corethink.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Author: jry <598821125@qq.com> <http://www.corethink.cn> -// +---------------------------------------------------------------------- - -/** - * 系统环境检测 - * @return array 系统环境数据 - * @author jry <598821125@qq.com> - */ -function checkEnv(){ - $items = [ - 'os' => [ - 'title' => '操作系统', - 'limit' => '不限制', - 'current' => PHP_OS, - 'icon' => 'fa fa-check text-success', - ], - 'php' => [ - 'title' => 'PHP版本', - 'limit' => '5.4+', - 'current' => PHP_VERSION, - 'icon' => 'fa fa-check text-success', - ], - 'upload' => [ - 'title' => '附件上传', - 'limit' => '不限制', - 'current' => ini_get('file_uploads') ? ini_get('upload_max_filesize'):'未知', - 'icon' => 'fa fa-check text-success', - ], - 'disk' => [ - 'title' => '磁盘空间', - 'limit' => '100M+', - 'current' => '未知', - 'icon' => 'fa fa-check text-success', - ], - ]; - - //PHP环境检测 - if($items['php']['current'] < 5.4){ - $items['php']['icon'] = 'fa fa-close text-danger'; - session('error', true); - } - - //磁盘空间检测 - if(function_exists('disk_free_space')){ - $disk_size = floor(disk_free_space('./') / (1024*1024)).'M'; - $items['disk']['current'] = $disk_size.'B'; - if($disk_size < 100){ - $items['disk']['icon'] = 'fa fa-close text-danger'; - session('error', true); - } - } - - return $items; -} - -/** - * 目录,文件读写检测 - * @return array 检测数据 - * @author jry <598821125@qq.com> - */ -function checkDirFile(){ - $items = [ - [ - 'type' => 'file', - 'path' => realpath(APP_PATH) .DS. 'database.php', - 'title' => '可写', - 'icon' => 'fa fa-check text-success', - ], - [ - 'type' => 'dir', - 'path' => RUNTIME_PATH, - 'title' => '可写', - 'icon' => 'fa fa-check text-success', - ], - [ - 'type' => 'dir', - 'path' => realpath(APP_PATH) .DS. 'extra' . DS, - 'title' => '可写', - 'icon' => 'fa fa-check text-success', - ] - ]; - - foreach ($items as &$val){ - $path = $val['path']; - if('dir' === $val['type']){ - if(!is_writable($path)){ - if(is_dir($path)) { - $val['title'] = '不可写'; - $val['icon'] = 'fa fa-close text-danger'; - session('error', true); - }else{ - $val['title'] = '不存在'; - $val['icon'] = 'fa fa-close text-danger'; - session('error', true); - } - } - }else{ - if(file_exists($path)){ - if(!is_writable($path)){ - $val['title'] = '不可写'; - $val['icon'] = 'fa fa-close text-danger'; - session('error', true); - } - }else{ - if(!is_writable(dirname($path))){ - $val['title'] = '不存在'; - $val['icon'] = 'fa fa-close text-danger'; - session('error', true); - } - } - } - } - return $items; -} - -/** - * MySQL数据库依赖检测 - * @return array 检测数据 - */ -function checkMySQL(){ - $items = [ - [ - 'type' => 'ext', - 'name' => 'pdo', - 'title' => '支持', - 'current' => extension_loaded('pdo'), - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'ext', - 'name' => 'pdo_mysql', - 'title' => '支持', - 'current' => extension_loaded('pdo_mysql'), - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ] - ]; - return baseCheck($items); -} - -/** - * MongoDB数据库依赖检测 - * @return array 检测数据 - */ -function checkMongoDB(){ - $items = [ - [ - 'type' => 'ext', - 'name' => 'mongoDB', - 'title' => '支持', - 'current' => extension_loaded('mongo'), - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'ext', - 'name' => 'ZipArchive', - 'title' => '支持', - 'current' => class_exists('ZipArchive'), - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'func', - 'name' => 'shell_exec', - 'title' => '支持', - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'com', - 'name' => 'zip', - 'title' => '支持', - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'com', - 'name' => 'mongodump', - 'title' => '支持', - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'com', - 'name' => 'mongorestore', - 'title' => '支持', - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ] - ]; - return baseCheck($items); -} - -/** - * Redis缓存依赖检测 - * @return array 检测数据 - */ -function checkRedis(){ - $items = [ - [ - 'type' => 'ext', - 'name' => 'Redis', - 'title' => '支持', - 'current' => extension_loaded('redis'), - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ] - ]; - return baseCheck($items); -} - -/** - * 其他公共部分检测 - * @return mixed - */ -function checkOther(){ - $items = [ - [ - 'type' => 'func', - 'name' => 'file_get_contents', - 'title' => '支持', - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'func', - 'name' => 'mb_strlen', - 'title' => '支持', - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - [ - 'type' => 'func', - 'name' => 'curl_init', - 'title' => '支持', - 'icon' => 'fa fa-check text-success', - 'isMust' => true - ], - ]; - return baseCheck($items); -} - -/** - * 基础函数检测 - * @param $items - * @return mixed - */ -function baseCheck($items){ - foreach($items as &$val){ - switch($val['type']){ - case 'ext': - if(!$val['current']){ - $val['title'] = '不支持'; - $val['icon'] = 'fa fa-close text-danger'; - if( $val['isMust'] ){ - session('error', true); - } - } - break; - case 'func': - if(!function_exists($val['name'])){ - $val['title'] = '不支持'; - $val['icon'] = 'fa fa-close text-danger'; - if( $val['isMust'] ){ - session('error', true); - } - } - break; - case 'com': - $com = 'which '.$val['name']; - if( !function_exists('shell_exec') ){ - $val['title'] = '不支持'; - $val['icon'] = 'fa fa-close text-danger'; - session('error', true); - }else{ - if(shell_exec($com) == null){ - $val['title'] = '不支持'; - $val['icon'] = 'fa fa-close text-danger'; - if( $val['isMust'] ){ - session('error', true); - } - } - } - break; - } - } - return $items; -} - -/** - * @param $msg - * @param string $class - */ -function showMsg($msg, $class = ''){ - usleep(20000); - echo "<script type=\"text/javascript\">showMsg(\"{$msg}\", \"{$class}\")</script>"; - ob_flush(); - flush(); -} diff --git a/application/install/config.php b/application/install/config.php deleted file mode 100644 index 3779064..0000000 --- a/application/install/config.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php -//配置文件 -return [ - -]; \ No newline at end of file diff --git a/application/install/controller/Index.php b/application/install/controller/Index.php deleted file mode 100644 index d2b7e92..0000000 --- a/application/install/controller/Index.php +++ /dev/null @@ -1,275 +0,0 @@ -<?php -namespace app\install\controller; - -use app\admin\model\User; -use think\Controller; -use think\Log; - -class Index extends Controller { - - protected function _initialize() { - $noVerify = ['index', 'complete']; - if (in_array($this->request->action(), $noVerify)) { - return true; - } - if (is_file(APP_PATH . 'extra' . DS . 'install.lock')) { - $this->error('已经成功安装了本系统,请不要重复安装!', 'http://'.$_SERVER['HTTP_HOST']); - } - } - - public function index(){ - session('step', 1); - session('error', false); - return $this->fetch(); - } - - public function step2(){ - if( $this->request->isPost() ){ - $data = $this->request->post(); - if( empty($data['db']['DB_HOST']) ){ - $data['db']['DB_HOST'] = '127.0.0.1'; - } - if( empty($data['db']['DB_NAME']) ){ - $this->error('数据库名称不能为空'); - } - if( empty($data['db']['DB_USER']) ){ - $this->error('数据库用户名不能为空'); - } - if( empty($data['db']['DB_PWD']) ){ - $this->error('数据库密码不能为空'); - } - if( empty($data['db']['DB_PORT']) ){ - if( $data['db']['DB_TYPE'] == 0 ){ - $data['db']['DB_PORT'] = 3306; - }else{ - $data['db']['DB_PORT'] = 27017; - } - } - if( $data['cache']['type'] != 0 ){ - if( empty($data['cache']['ip']) ){ - $data['cache']['ip'] = '127.0.0.1'; - } - if( empty($data['cache']['port']) ){ - $data['cache']['port'] = 6379; - } - } - if( empty($data['admin']['name']) ){ - $this->error('管理员账号不能为空'); - } - if( empty($data['admin']['pass']) ){ - $this->error('管理员密码不能为空'); - } - session('step', 2); - session('dbConfig', $data['db']); - session('cacheConfig', $data['cache']); - session('adminConfig', $data['admin']); - session('isCover', $data['cover']); - $this->success('参数正确开始安装', url('step3')); - }else{ - $step = session('step'); - if($step != 1 && $step != 4){ - $this->error("请按顺序安装", url('index')); - }else{ - session('error', false); - return $this->fetch(); - } - } - } - - public function step3(){ - $step = session('step'); - if( $step != 2 && $step != 3 ){ - $this->error("请按顺序安装", url('index')); - }else{ - session('step', 3); - session('error', false); - $dbConfig = session('dbConfig'); - $cacheConfig = session('cacheConfig'); - //环境检测 - $this->assign('checkEnv', checkEnv()); - //目录文件读写检测 - $this->assign('checkDirFile', checkDirFile()); - - if( $dbConfig['DB_TYPE'] == 0 ){ - $this->assign('checkDB', checkMySQL()); - }else{ - $this->assign('checkDB', checkMongoDB()); - } - if( $cacheConfig['type'] == 1 ){ - $this->assign('checkCache', checkRedis()); - } - $this->assign('checkOther', checkOther()); - return $this->fetch(); - } - } - - public function step4(){ - if(session('error')){ - $this->error('环境检测没有通过,请调整环境后重试!', url('step3')); - }else{ - $step = session('step'); - if( $step != 3){ - $this->error("请按顺序安装", url('index')); - }else{ - session('step', 4); - session('error', false); - echo $this->fetch(); - $dbConfig = session('dbConfig'); - $cacheConfig = session('cacheConfig'); - $adminConfig = session('adminConfig'); - //暂不生效 - $isCover = session('isCover'); - $extraConfPath = APP_PATH.'extra'.DS; - - //生成加密秘钥 - $addChars = '`~!@#$%^&*()_+-=[]{};:"|,.<>/?'; - $baseConfig['AUTH_KEY'] = $auth = \StrOrg::randString(64, '', $addChars); - //处理管理员密码 - $adminPass = (new User())->getPwdHash($adminConfig['pass'], $auth); - $regIp = $this->request->ip(1); - //检测数据库连接,并且初始化数据 - if( $dbConfig['DB_TYPE'] == 0 ){ - $dbConfig['DB_TYPE'] = 'mysql'; - $dsn = "mysql:dbname={$dbConfig['DB_NAME']};host={$dbConfig['DB_HOST']};port={$dbConfig['DB_PORT']};charset=utf8mb4"; - try { - $db = new \PDO($dsn, $dbConfig['DB_USER'], $dbConfig['DB_PWD']); - } catch (\PDOException $e) { - $this->error($e->getMessage(), url('step2')); - } - $this->writeConfig($dbConfig, 'database', APP_PATH); - $this->executeSQL($db, $dbConfig['DB_PREFIX']); - $adminSql = "INSERT INTO `{$dbConfig['DB_PREFIX']}user` (`username`, `nickname`, `password`, `regTime`, `regIp`, `status`) ". - "VALUES ('{$adminConfig['name']}','系统管理员','{$adminPass}',".time().",{$regIp},1);"; - Log::write($adminSql,'log'); - $db->exec($adminSql); - $baseConfig['ADMIN_ID'] = $db->lastInsertId(); - } - //检测Redis链接状态,并且初始化配置 - if( $cacheConfig['type'] == 1 ){ - try { - (new \Redis())->connect($cacheConfig['ip'],$cacheConfig['port']); - } catch (\RedisException $e) { - $this->error($e->getMessage(), url('step2')); - } - $this->writeConfig($cacheConfig, 'cache', $extraConfPath); - } - $this->writeConfig($baseConfig, 'base', $extraConfPath); - if(session('error')){ - $this->error('安装出错,错误细节请查看Log!', url('index')); - }else{ - $str = "<meta http-equiv='Refresh' content='0;URL=".url('complete')."'>"; - exit($str); - } - } - } - } - - public function complete(){ - if(session('step') !== 4){ - $this->error('请正确安装系统', url('index')); - } - file_put_contents(APP_PATH .'extra' . DS . 'install.lock', 'lock'); - session(null); - return $this->fetch(); - } - - /** - * 写入配置文件 - * @param $config - * @param $type string 配置类型 - * @param $path string 配置文件存储路径 - * @return bool - */ - private function writeConfig($config, $type, $path){ - if(is_array($config)){ - showMsg('开始写入配置文件...', 'info'); - //读取配置内容 - $conf = file_get_contents(APP_PATH . $this->request->module(). DS . 'data'. DS .$type.'.tpl'); - //替换配置项 - foreach ($config as $name => $value) { - $conf = str_replace("[{$name}]", $value, $conf); - } - //写入应用配置文件 - if(file_put_contents($path.$type.'.php', $conf)){ - showMsg('写入配置文件'.$type.'...成功', 'success'); - }else{ - showMsg('写入配置文件'.$type.'...失败!', 'danger'); - session('error', true); - } - return true; - } - } - - /** - * 执行sql文件,初始化数据 - * @param $db - * @param $prefix - */ - private function executeSQL($db, $prefix = '') { - //读取SQL文件 - $sql = file_get_contents(APP_PATH . $this->request->module(). DS . 'data'. DS .'install.sql'); - $sql = str_replace("\r", "\n", $sql); - $sql = explode(";\n", $sql); - - //开始安装 - showMsg('开始安装数据库...', 'info'); - foreach ($sql as $value) { - $value = trim($value); - if (empty($value)) continue; - if( strpos($value, 'CREATE TABLE') !== false ){ - $name = preg_replace('/^CREATE TABLE `(\w+)` .*/s', '\1', $value); - $value = str_replace("CREATE TABLE `{$name}`", "CREATE TABLE `{$prefix}{$name}`", $value); - $msg = "创建数据表{$name}"; - if (false !== $db->exec($value)) { - Log::record($value,'log'); - showMsg($msg . '...成功', 'success'); - } else { - Log::record($value,'error'); - showMsg($msg . '...失败!', 'danger'); - session('error', true); - } - }elseif ( strpos($value, 'DROP TABLE') !== false ){ - preg_match('/DROP TABLE IF EXISTS `(.*)`.*?/s', $value, $name); - $value = str_replace("DROP TABLE IF EXISTS `{$name[1]}`", "DROP TABLE IF EXISTS `{$prefix}{$name[1]}`", $value); - $msg = "删除数据表{$name[1]}"; - if (false !== $db->exec($value)) { - Log::record($value,'log'); - showMsg($msg . '...成功', 'success'); - } else { - Log::record($value,'error'); - showMsg($msg . '...失败!', 'danger'); - session('error', true); - } - }elseif ( strpos($value, 'LOCK TABLES') !== false ){ - $name = preg_replace('/^LOCK TABLES `(\w+)` .*/s', '\1', $value); - $value = str_replace("LOCK TABLES `{$name}", "LOCK TABLES `{$prefix}{$name}", $value); - $msg = "锁定数据表{$name}"; - if (false !== $db->exec($value)) { - Log::record($value,'log'); - showMsg($msg . '...成功', 'success'); - } else { - Log::record($value,'error'); - showMsg($msg . '...失败!', 'danger'); - session('error', true); - } - }elseif ( strpos($value, 'INSERT INTO') !== false ){ - $name = preg_replace('/^INSERT INTO `(\w+)` .*/s', '\1', $value); - $value = str_replace("INSERT INTO `{$name}`", "INSERT INTO `{$prefix}{$name}`", $value); - $msg = "初始化表{$name}数据"; - if (false !== $db->exec($value)) { - Log::record($value,'log'); - showMsg($msg . '...成功', 'success'); - } else { - Log::record($value,'error'); - showMsg($msg . '...失败!', 'danger'); - session('error', true); - } - }else{ - Log::record($value,'debug'); - $db->exec($value); - } - } - Log::save(); - } - -} diff --git a/application/install/data/base.tpl b/application/install/data/base.tpl deleted file mode 100644 index 7e4d10e..0000000 --- a/application/install/data/base.tpl +++ /dev/null @@ -1,8 +0,0 @@ -<?php -/** - * ApiAdmin基础配置模板【由系统自动生成】 - */ -return [ - 'auth_key' => '[AUTH_KEY]', - 'USER_ADMINISTRATOR' => '[ADMIN_ID]', -]; \ No newline at end of file diff --git a/application/install/data/cache.tpl b/application/install/data/cache.tpl deleted file mode 100644 index 17d63d5..0000000 --- a/application/install/data/cache.tpl +++ /dev/null @@ -1,16 +0,0 @@ -<?php -/** - * ApiAdmin缓存配置文件【由系统自动生成】 - */ -return [ - 'cache' => [ - // 驱动方式 - 'type' => 'File', - // 缓存保存目录 - 'path' => CACHE_PATH, - // 缓存前缀 - 'prefix' => '', - // 缓存有效期 0表示永久缓存 - 'expire' => 0, - ] -]; diff --git a/application/install/data/database.tpl b/application/install/data/database.tpl deleted file mode 100644 index 8b56e87..0000000 --- a/application/install/data/database.tpl +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/** - * ApiAdmin数据库连接配置文件【由系统自动生成】 - */ -return [ - // 数据库类型 - 'type' => '[DB_TYPE]', - // 服务器地址 - 'hostname' => '[DB_HOST]', - // 数据库名 - 'database' => '[DB_NAME]', - // 用户名 - 'username' => '[DB_USER]', - // 密码 - 'password' => '[DB_PWD]', - // 端口 - 'hostport' => '[DB_PORT]', - // 数据库编码默认采用utf8 - 'charset' => 'utf8', - // 数据库表前缀 - 'prefix' => '[DB_PREFIX]', -]; \ No newline at end of file diff --git a/application/install/data/install.sql b/application/install/data/install.sql deleted file mode 100644 index 3dd7a91..0000000 --- a/application/install/data/install.sql +++ /dev/null @@ -1,309 +0,0 @@ -# ************************************************************ -# Sequel Pro SQL dump -# Version 4541 -# -# http://www.sequelpro.com/ -# https://github.com/sequelpro/sequelpro -# -# Host: 127.0.0.1 (MySQL 5.7.14-log) -# Database: apiAdmin -# Generation Time: 2016-12-12 15:59:11 +0000 -# ************************************************************ - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - - -# Dump of table api -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `api`; - -CREATE TABLE `api` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `appId` int(11) NOT NULL COMMENT '关联的APP的ID', - `name` varchar(50) NOT NULL DEFAULT '' COMMENT 'API名称', - `mark` varchar(50) NOT NULL COMMENT '接口标记', - `info` varchar(100) NOT NULL DEFAULT '' COMMENT 'API功能描述', - `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '接口状态', - `warning` varchar(50) NOT NULL DEFAULT '' COMMENT '接口提示', - `version` varchar(20) NOT NULL DEFAULT '' COMMENT '接口版本', - `map` varchar(32) NOT NULL DEFAULT '' COMMENT '接口映射,系统生成可以隐藏原有接口', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API接口表'; - -# Dump of table api_back -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `api_back`; - -CREATE TABLE `api_back` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `apiId` int(11) DEFAULT NULL COMMENT '关联的API的ID', - `name` varchar(50) NOT NULL DEFAULT '' COMMENT '字段名称', - `type` varchar(20) NOT NULL COMMENT '字段类型', - `info` varchar(50) NOT NULL DEFAULT '' COMMENT '字段说明', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='接口返回参数规则说明'; - -# Dump of table api_fields -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `api_fields`; - -CREATE TABLE `api_fields` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `apiId` int(11) DEFAULT NULL COMMENT '关联的API的ID', - `name` varchar(50) NOT NULL DEFAULT '' COMMENT '参数名称', - `type` varchar(20) NOT NULL COMMENT '参数类型', - `must` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否必须1必须0不必须', - `default` varchar(100) NOT NULL DEFAULT '' COMMENT '字段默认值', - `info` varchar(50) NOT NULL DEFAULT '' COMMENT '字段说明', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请求接口需求参数说明'; - -# Dump of table app -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `app`; - -CREATE TABLE `app` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL DEFAULT '' COMMENT '应用名称', - `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '应用状态', - `info` varchar(50) NOT NULL DEFAULT '' COMMENT '应用描述', - `baseUrl` varchar(50) NOT NULL DEFAULT '' COMMENT 'API基础URL', - `type` tinyint(2) NOT NULL DEFAULT '0' COMMENT '参与方式', - `oauth` int(11) NOT NULL DEFAULT '0' COMMENT '认证方式', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -# Dump of table app_member -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `app_member`; - -CREATE TABLE `app_member` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL DEFAULT '' COMMENT '管理员名称', - `phone` varchar(11) NOT NULL DEFAULT '' COMMENT '管理员手机号', - `email` varchar(50) NOT NULL DEFAULT '' COMMENT '管理员邮箱', - `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '管理员状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='应用管理员表'; - -# Dump of table auth_group -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `auth_group`; - -CREATE TABLE `auth_group` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL COMMENT '组名称', - `description` varchar(50) NOT NULL COMMENT '组描述', - `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '组状态:为1正常,为0禁用', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限组'; - -# Dump of table auth_group_access -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `auth_group_access`; - -CREATE TABLE `auth_group_access` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `uid` mediumint(8) unsigned NOT NULL, - `groupId` mediumint(8) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `uid` (`uid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户和组的对应关系'; - -# Dump of table auth_rule -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `auth_rule`; - -CREATE TABLE `auth_rule` ( - `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, - `url` char(80) NOT NULL DEFAULT '' COMMENT '规则唯一标识', - `groupId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '权限所属组的ID', - `auth` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '权限数值', - `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态:为1正常,为0禁用', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限细节'; - -# Dump of table filter -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `filter`; - -CREATE TABLE `filter` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `total` int(11) NOT NULL DEFAULT '0' COMMENT '请求总数', - `month` int(11) NOT NULL DEFAULT '0' COMMENT '每月请求频率', - `day` int(11) NOT NULL DEFAULT '0' COMMENT '每天请求频率', - `hour` int(11) NOT NULL DEFAULT '0' COMMENT '每小时请求频率', - `minute` int(11) NOT NULL DEFAULT '0' COMMENT '每分钟请求频率', - `second` int(11) NOT NULL DEFAULT '0' COMMENT '没秒钟请求频率', - `name` varchar(50) NOT NULL DEFAULT '' COMMENT '过滤组名称', - `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '过滤组状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Api过滤组配置'; - -# Dump of table keys -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `keys`; - -CREATE TABLE `keys` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `description` varchar(50) NOT NULL DEFAULT '' COMMENT '当前Key的备注', - `accessKey` varchar(64) NOT NULL DEFAULT '' COMMENT '公钥', - `secretKey` varchar(64) NOT NULL DEFAULT '' COMMENT '私钥', - `appId` int(11) NOT NULL DEFAULT '0' COMMENT '适配App的ID', - `filterId` int(11) NOT NULL DEFAULT '0' COMMENT '适配过滤组的ID', - `addTime` int(10) NOT NULL DEFAULT '0' COMMENT '创建时间戳', - `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '秘钥状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API认证秘钥对表'; - -# Dump of table menu -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `menu`; - -CREATE TABLE `menu` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单名', - `fid` int(11) NOT NULL COMMENT '父级菜单ID', - `url` varchar(50) NOT NULL DEFAULT '' COMMENT '链接', - `auth` tinyint(2) NOT NULL DEFAULT '0' COMMENT '访客权限', - `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', - `hide` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否显示', - `icon` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单图标', - `level` tinyint(2) NOT NULL DEFAULT '0' COMMENT '菜单认证等级', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='目录信息'; - -LOCK TABLES `menu` WRITE; -/*!40000 ALTER TABLE `menu` DISABLE KEYS */; - -INSERT INTO `menu` (`id`, `name`, `fid`, `url`, `auth`, `sort`, `hide`, `icon`, `level`) -VALUES - (1, '系统维护', 0, '', 12, 1, 0, 'fa-institution', 1), - (2, '菜单管理', 1, 'Menu/index', 0, 1, 0, 'fa-navicon', 0), - (3, '用户管理', 1, 'User/index', 0, 2, 0, 'fa-users', 0), - (4, '权限管理', 1, 'Auth/index', 0, 3, 0, 'fa-bolt', 0), - (5, '操作日志', 1, 'UserLog/index', 0, 30, 0, 'fa-suitcase', 0), - (6, '首页', 0, 'Index/index', 15, 100, 1, '', 0), - (7, '新增菜单', 2, 'Menu/add', 0, 0, 0, '', 0), - (8, '编辑菜单', 2, 'Menu/edit', 0, 0, 0, '', 0), - (9, '删除菜单', 2, 'Menu/del', 0, 0, 0, '', 0), - (10, '新增用户', 3, 'User/add', 0, 0, 0, '', 0), - (11, '删除用户', 3, 'User/del', 0, 0, 0, '', 0), - (12, '启用用户', 3, 'User/open', 0, 0, 0, '', 0), - (13, '禁用用户', 3, 'User/close', 0, 0, 0, '', 0), - (14, '修改用户', 3, 'User/edit', 0, 0, 0, '', 0), - (15, '新增用户组', 4, 'Auth/add', 0, 0, 0, '', 0), - (16, '删除用户组', 4, 'Auth/del', 0, 0, 0, '', 0), - (17, '编辑用户组', 4, 'Auth/edit', 0, 0, 0, '', 0), - (18, '启用用户组', 4, 'Auth/open', 0, 0, 0, '', 0), - (19, '禁用用户组', 4, 'Auth/close', 0, 0, 0, '', 0), - (20, '获取组权限', 4, 'Auth/access', 0, 0, 0, '', 0), - (21, '组用户管理', 4, 'Auth/userAuth', 0, 0, 0, '', 0), - (22, '用户赋权', 4, 'Auth/group', 0, 0, 0, '', 0), - (23, '应用管理', 0, '', 0, 6, 0, 'fa-cubes', 0), - (24, '应用组管理', 23, 'AppManager/index', 0, 0, 0, 'fa-rss', 0), - (25, '基础配置', 0, '', 0, 5, 0, 'fa-cogs', 0), - (26, '管理员配置', 25, 'AppMember/index', 0, 0, 0, 'fa-user', 0), - (27, '秘钥配置', 25, 'KeyManager/index', 0, 1, 0, 'fa-key', 0), - (28, '规则组配置', 25, 'FilterManager/index', 0, 2, 0, 'fa-filter', 0), - (29, '监控组配置', 25, 'WatchManager/index', 0, 3, 0, 'fa-eye', 0), - (30, '报警组配置', 25, 'WarnManager/index', 0, 4, 0, 'fa-warning', 0), - (31, 'API接口管理', 23, 'ApiManager/index', 0, 1, 0, 'fa-usb', 0), - (32, 'API接口调试', 23, 'ApiDebug/index', 0, 2, 0, 'fa-bug', 0), - (33, '接管第三方', 0, '', 0, 7, 0, 'fa-cloud', 0), - (34, '认证方式', 33, 'TakeOver/auth', 0, 0, 0, 'fa-fire', 0), - (35, '公共参数', 33, 'TakeOver/param', 0, 1, 0, 'fa-file', 0), - (36, '接口映射', 33, 'TakeOver/copy', 0, 2, 0, 'fa-copy', 0), - (37, '新增管理员', 26, 'AppMember/add', 0, 0, 0, '', 0), - (38, '启用管理员', 26, 'AppMember/open', 0, 0, 0, '', 0), - (39, '禁用管理员', 26, 'AppMember/close', 0, 0, 0, '', 0), - (40, '删除管理员', 26, 'AppMember/del', 0, 0, 0, '', 0), - (41, '编辑管理员', 26, 'AppMember/edit', 0, 0, 0, '', 0), - (42, '新增秘钥', 27, 'KeyManager/add', 0, 0, 0, '', 0), - (43, '启用秘钥', 27, 'KeyManager/open', 0, 0, 0, '', 0), - (44, '禁用秘钥', 27, 'KeyManager/close', 0, 0, 0, '', 0), - (45, '删除秘钥', 27, 'KeyManager/del', 0, 0, 0, '', 0), - (46, '新增规则组', 28, 'FilterManager/add', 0, 0, 0, '', 0), - (47, '启用规则组', 28, 'FilterManager/open', 0, 0, 0, '', 0), - (48, '禁用规则组', 28, 'FilterManager/close', 0, 0, 0, '', 0), - (49, '删除规则组', 28, 'FilterManager/del', 0, 0, 0, '', 0), - (50, '编辑规则组', 28, 'FilterManager/edit', 0, 0, 0, '', 0), - (51, '编辑秘钥', 27, 'KeyManager/edit', 0, 0, 0, '', 0), - (52, '新增应用', 24, 'AppManager/add', 0, 0, 0, '', 0), - (53, '编辑应用', 24, 'AppManager/edit', 0, 0, 0, '', 0), - (54, '启用应用', 24, 'AppManager/open', 0, 0, 0, '', 0), - (55, '禁用应用', 24, 'AppManager/close', 0, 0, 0, '', 0), - (56, '删除应用', 24, 'AppManager/del', 0, 0, 0, '', 0), - (57, '新增接口', 31, 'ApiManager/add', 0, 0, 0, '', 0), - (58, '编辑接口', 31, 'ApiManager/edit', 0, 0, 0, '', 0), - (59, '删除接口', 31, 'ApiManager/del', 0, 0, 0, '', 0), - (60, '启用接口', 31, 'ApiManager/open', 0, 0, 0, '', 0), - (61, '禁用接口', 31, 'ApiManager/close', 0, 0, 0, '', 0), - (62, '请求参数列表', 31, 'ApiFieldsManager/index', 0, 0, 0, '', 0), - (63, '返回参数列表', 31, 'ApiFieldsManager/back', 0, 0, 0, '', 0), - (64, '新增请求参数', 31, 'ApiFieldsManager/add', 0, 0, 0, '', 0), - (65, '编辑请求参数', 31, 'ApiFieldsManager/edit', 0, 0, 0, '', 0), - (66, '删除请求参数', 31, 'ApiFieldsManager/del', 0, 0, 0, '', 0), - (67, '新增返回参数', 31, 'ApiFieldsManager/backAdd', 0, 0, 0, '', 0), - (68, '编辑返回参数', 31, 'ApiFieldsManager/backEdit', 0, 0, 0, '', 0), - (69, '删除返回参数', 31, 'ApiFieldsManager/backDel', 0, 0, 0, '', 0); - -/*!40000 ALTER TABLE `menu` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table user -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `user`; - -CREATE TABLE `user` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `username` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', - `nickname` varchar(64) NOT NULL DEFAULT '' COMMENT '用户昵称', - `password` char(32) NOT NULL DEFAULT '' COMMENT '用户密码', - `regTime` int(10) NOT NULL DEFAULT '0' COMMENT '注册时间', - `regIp` varchar(11) NOT NULL DEFAULT '' COMMENT '注册IP', - `updateTime` int(10) NOT NULL DEFAULT '0' COMMENT '更新时间', - `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '账号状态 0封号 1正常', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员认证信息'; - -# Dump of table user_data -# ------------------------------------------------------------ - -DROP TABLE IF EXISTS `user_data`; - -CREATE TABLE `user_data` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `loginTimes` int(11) NOT NULL COMMENT '账号登录次数', - `lastLoginIp` varchar(11) NOT NULL DEFAULT '' COMMENT '最后登录IP', - `lastLoginTime` int(11) NOT NULL COMMENT '最后登录时间', - `uid` varchar(11) NOT NULL DEFAULT '' COMMENT '用户ID', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员数据表'; - -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_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 */; diff --git a/application/install/model/index.html b/application/install/model/index.html deleted file mode 100644 index e69de29..0000000 diff --git a/application/install/view/index/complete.html b/application/install/view/index/complete.html deleted file mode 100644 index fd2bda6..0000000 --- a/application/install/view/index/complete.html +++ /dev/null @@ -1,20 +0,0 @@ -{extend name="public/base" /} -{block name="title"}系统安装Step4{/block} -{block name="nav"} -<li><a href="javascript:;">安装协议</a></li> -<li><a href="javascript:;">参数设置</a></li> -<li><a href="javascript:;">环境检测</a></li> -<li><a href="javascript:;">开始安装</a></li> -<li class="active"><a href="javascript:;">安装完成</a></li> -{/block} -{block name="main"} -<div class="panel panel-default"> - <div class="panel-heading">恭喜您,{:config('PRODUCT_NAME')} 安装完成!</div> - <div class="panel-body" style="font-size: 14px"> - <div class="alert alert-success" role="alert"> - <h4 align="center">{:config('PRODUCT_NAME')}提示您:您的系统已经成功安装,为了系统安全,请删除Install模块!</h4> - </div> - <a class="btn btn-primary btn-block" target="_blank" href="http://{:$_SERVER['HTTP_HOST']}">进入系统</a> - </div> -</div> -{/block} \ No newline at end of file diff --git a/application/install/view/index/index.html b/application/install/view/index/index.html deleted file mode 100644 index 9b15457..0000000 --- a/application/install/view/index/index.html +++ /dev/null @@ -1,23 +0,0 @@ -{extend name="public/base" /} -{block name="title"}系统安装Step1{/block} -{block name="nav"} -<li class="active"><a href="javascript:;">安装协议</a></li> -<li><a href="javascript:;">参数设置</a></li> -<li><a href="javascript:;">环境检测</a></li> -<li><a href="javascript:;">开始安装</a></li> -<li><a href="javascript:;">安装完成</a></li> -{/block} -{block name="main"} -<div class="panel panel-default"> - <div class="panel-heading">{:config('PRODUCT_NAME')} 安装协议</div> - <div class="panel-body" style="font-size: 14px"> - <p>感谢您选择{:config('PRODUCT_NAME')},希望我们的努力能为您提供一个简单、高效、卓越的轻量级产品开发框架。</p> - <p>用户须知:本协议是您与{:config('COMPANY_NAME')}之间关于您使用{:config('PRODUCT_NAME')}产品及服务的法律协议。本产品是一个对商业友好的开源项目,您可以随意的进行二次开发,修改和发布。</p> - <p>本服务条款一旦发生变更, {:config('COMPANY_NAME')}将在官网上公布修改内容。修改后的服务条款一旦在网站公布即有效代替原来的服务条款。您可随时登陆官网查阅最新版服务条款。如果您选择接受本条款,即表示您同意接受协议各项条件的约束。如果您不同意本服务条款,则不能获得使用本服务的权利。您若有违反本条款规定,{:config('COMPANY_NAME')}有权随时中止或终止您对{:config('PRODUCT_NAME')}产品的使用资格并保留追究相关法律责任的权利。</p> - <p>在理解、同意、并遵守本协议的全部条款后,方可开始使用{:config('PRODUCT_NAME')}产品。您也可能与{:config('COMPANY_NAME')}直接签订另一书面协议,以补充或者取代本协议的全部或者任何部分。</p> - <p>{:config('COMPANY_NAME')}拥有{:config('PRODUCT_NAME')}的全部知识产权,包括商标和著作权。虽然在大部分情况下您都可以自由的进行修改、复制、下载、安装、使用或者以其他方式受益于本软件的功能或者知识产权。但是{:config('COMPANY_NAME')}还是希望您能在底部保留我们的链接和版权声明!</p> - <a type="button" href="{:url('step2')}" class="btn btn-primary btn-block">同意安装协议</a> - <a type="button" href="{:config('WEBSITE_DOMAIN')}" class="btn btn-default btn-block">不同意</a> - </div> -</div> -{/block} \ No newline at end of file diff --git a/application/install/view/index/step2.html b/application/install/view/index/step2.html deleted file mode 100644 index d716ad4..0000000 --- a/application/install/view/index/step2.html +++ /dev/null @@ -1,88 +0,0 @@ -{extend name="public/base" /} -{block name="title"}系统安装Step2{/block} -{block name="nav"} -<li><a href="javascript:;">安装协议</a></li> -<li class="active"><a href="javascript:;">参数设置</a></li> -<li><a href="javascript:;">环境检测</a></li> -<li><a href="javascript:;">开始安装</a></li> -<li><a href="javascript:;">安装完成</a></li> -{/block} -{block name="main"} -<div class="panel panel-default"> - <div class="panel-heading">{:config('PRODUCT_NAME')} 参数设置</div> - <div class="panel-body" style="font-size: 14px"> - <form role="form" id="form-setup" action="{:url('step2')}" method="post" > - <h3 style="margin-top: 5px"><span class="label label-info">系统数据库配置</span></h3> - <div class="form-group"> - <label>数据库连接类型</label> - <select name="db[DB_TYPE]" class="form-control"> - <option value="0">MySQL/MariaDB</option> - <option value="1" disabled>MongoDB[预留]</option> - </select> - </div> - <div class="form-group"> - <label>数据库服务器,数据库服务器IP,一般为127.0.0.1</label> - <input class="form-control" type="text" name="db[DB_HOST]" value="" placeholder="127.0.0.1"> - </div> - <div class="form-group"> - <label>数据库名</label> - <input class="form-control" type="text" name="db[DB_NAME]" value="apiAdmin"> - </div> - <div class="form-group"> - <label>是否覆盖同名数据库【暂不支持不覆盖安装】</label> - <div class="radio"> - <label> - <input type="radio" name="cover" value="0" disabled> 不覆盖 - </label> - <label> - <input type="radio" name="cover" value="1" checked> 覆盖 - </label> - </div> - </div> - <div class="form-group"> - <label>数据库用户名</label> - <input class="form-control" type="text" name="db[DB_USER]" value="" placeholder="请输入数据库用户名"> - </div> - <div class="form-group"> - <label>数据库密码</label> - <input class="form-control" type="text" name="db[DB_PWD]" value="" placeholder="请输入数据库密码"> - </div> - <div class="form-group"> - <label>数据库端口</label> - <input class="form-control" type="text" name="db[DB_PORT]" value="" placeholder="3306/27017"> - </div> - <div class="form-group"> - <label>数据表前缀,同一个数据库运行多个系统时请修改为不同的前缀</label> - <input class="form-control" type="text" name="db[DB_PREFIX]" value="" placeholder="请输入数据表前缀"> - </div> - <h3><span class="label label-info">系统缓存配置</span></h3> - <div class="form-group"> - <label>系统缓存类型:</label> - <select class="form-control" name="cache[type]"> - <option value="0">File</option> - <option value="1" disabled>Redis[预留]</option> - </select> - </div> - <div class="form-group"> - <label>系统缓存IP:</label> - <input class="form-control" type="text" name="cache[ip]" value="" placeholder="127.0.0.1"> - </div> - <div class="am-form-group"> - <label>系统缓存端口:</label> - <input class="form-control" type="text" name="cache[port]" value="" placeholder="6379"> - </div> - <h3><span class="label label-info">管理员账号配置</span></h3> - <div class="form-group"> - <label>管理员账号:</label> - <input class="form-control" type="text" name="admin[name]" value=""> - </div> - <div class="form-group"> - <label>管理员密码:</label> - <input class="form-control" type="text" name="admin[pass]" value="" placeholder="这里的密码明文显示,请注意!"> - </div> - <a type="button" target-form="form-setup" class="ajax-post redirect btn btn-primary btn-block">下一步</a> - <a type="button" href="{:url('index')}" class="btn btn-default btn-block">上一步</a> - </form> - </div> -</div> -{/block} \ No newline at end of file diff --git a/application/install/view/index/step3.html b/application/install/view/index/step3.html deleted file mode 100644 index b97f211..0000000 --- a/application/install/view/index/step3.html +++ /dev/null @@ -1,109 +0,0 @@ -{extend name="public/base" /} -{block name="title"}系统安装Step3{/block} -{block name="nav"} -<li><a href="javascript:;">安装协议</a></li> -<li><a href="javascript:;">参数设置</a></li> -<li class="active"><a href="javascript:;">环境检测</a></li> -<li><a href="javascript:;">开始安装</a></li> -<li><a href="javascript:;">安装完成</a></li> -{/block} -{block name="main"} -<div class="panel panel-default"> - <div class="panel-heading">{:config('PRODUCT_NAME')} 环境检测</div> - <div class="panel-body" style="font-size: 14px"> - <table class="table table-hover"> - <caption><h4>运行环境检查</h4></caption> - <thead> - <tr> - <th>项目</th> - <th>所需配置</th> - <th>当前配置</th> - </tr> - </thead> - <tbody> - {volist name="checkEnv" id="item"} - <tr> - <td>{$item['title']}</td> - <td>{$item['limit']}</td> - <td><i class="{$item['icon']}"></i> {$item['current']}</td> - </tr> - {/volist} - </tbody> - </table> - <table class="table table-hover"> - <caption><h4>目录、文件权限检查</h4></caption> - <thead> - <tr> - <th>目录/文件</th> - <th>所需状态</th> - <th>当前状态</th> - </tr> - </thead> - <tbody> - {volist name="checkDirFile" id="item"} - <tr> - <td>{$item['path']}</td> - <td>可写</td> - <td><i class="{$item['icon']}"></i> {$item['title']}</td> - </tr> - {/volist} - </tbody> - </table> - <table class="table table-hover"> - <caption><h4>数据库依赖检查</h4></caption> - <thead> - <tr> - <th>名称</th> - <th>检查结果</th> - </tr> - </thead> - <tbody> - {volist name="checkDB" id="item"} - <tr> - <td>{$item['name']}</td> - <td><i class="{$item['icon']}"></i> {$item['title']}</td> - </tr> - {/volist} - </tbody> - </table> - {if condition="isset($checkCache)"} - <table class="table table-hover"> - <caption><h4>缓存依赖检查</h4></caption> - <thead> - <tr> - <th>名称</th> - <th>检查结果</th> - </tr> - </thead> - <tbody> - {volist name="checkCache" id="item"} - <tr> - <td>{$item['name']}</td> - <td><i class="{$item['icon']}"></i> {$item['title']}</td> - </tr> - {/volist} - </tbody> - </table> - {/if} - <table class="table table-hover"> - <caption><h4>函数及扩展依赖性检查</h4></caption> - <thead> - <tr> - <th>名称</th> - <th>检查结果</th> - </tr> - </thead> - <tbody> - {volist name="checkOther" id="item"} - <tr> - <td>{$item['name']}</td> - <td><i class="{$item['icon']}"></i> {$item['title']}</td> - </tr> - {/volist} - </tbody> - </table> - <a type="button" href="{:url('step4')}" class="btn btn-primary btn-block">下一步</a> - <a type="button" href="{:url('step2')}" class="btn btn-default btn-block">上一步</a> - </div> -</div> -{/block} \ No newline at end of file diff --git a/application/install/view/index/step4.html b/application/install/view/index/step4.html deleted file mode 100644 index 89039df..0000000 --- a/application/install/view/index/step4.html +++ /dev/null @@ -1,39 +0,0 @@ -{extend name="public/base" /} -{block name="title"}系统安装Step4{/block} -{block name="nav"} -<li><a href="javascript:;">安装协议</a></li> -<li><a href="javascript:;">参数设置</a></li> -<li><a href="javascript:;">环境检测</a></li> -<li class="active"><a href="javascript:;">开始安装</a></li> -<li><a href="javascript:;">安装完成</a></li> -{/block} -{block name="main"} -<style> - .install-database { - height: 500px; - max-height: 500px; - overflow-y: scroll; - } - .install-database p{ - padding: 15px; - } -</style> -<div class="panel panel-default"> - <div class="panel-heading">{:config('PRODUCT_NAME')} 开始安装</div> - <div class="panel-body" style="font-size: 14px"> - <div id="show-list" class="install-database"> - </div> - <script type="text/javascript"> - var list = document.getElementById('show-list'); - function showMsg(msg, classname){ - var li = document.createElement('p'); - li.innerHTML = msg; - classname && li.setAttribute('class', 'bg-' + classname); - list.appendChild(li); - document.scrollTop += 30; - } - </script> - <button class="btn btn-warning btn-block" disabled>正在安装,请稍后...</button> - </div> -</div> -{/block} \ No newline at end of file diff --git a/application/install/view/public/base.html b/application/install/view/public/base.html deleted file mode 100644 index bd48bd7..0000000 --- a/application/install/view/public/base.html +++ /dev/null @@ -1,93 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <title>ApiAdmin | {block name="title"}{/block}</title> - <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> - <link rel="stylesheet" href="__PLUGIN__/bootstrap/css/bootstrap.min.css"> - <link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css"> - <link rel="stylesheet" href="//cdn.bootcss.com/ionicons/2.0.1/css/ionicons.min.css"> - <link rel="stylesheet" href="__CSS__/AdminLTE.min.css"> - <link rel="stylesheet" href="__CSS__/skins/_all-skins.min.css"> - <link rel="icon" href="__IMG__/favicon.ico"> - <style> - body{ - font-family: "Microsoft YaHei",FontAwesome,sans-serif; - } - .builder-data-empty { - margin-bottom: 20px; - background-color: #f9f9f9; - } - .no-data { - padding: 130px 0; - color: #555; - } - .am-text-center { - text-align: center !important; - } - a{ - cursor:pointer; - } - </style> - <!--[if lt IE 9]> - <script src="__PLUGIN__/compatible/html5shiv.js"></script> - <script src="__PLUGIN__/compatible/respond.min.js"></script> - <![endif]--> -</head> -<!-- ADD THE CLASS layout-top-nav TO REMOVE THE SIDEBAR. --> -<body class="hold-transition skin-blue layout-top-nav"> -<div class="wrapper"> - - <header class="main-header"> - <nav class="navbar navbar-static-top"> - <div class="container"> - <div class="navbar-header"> - <a href="{:config('WEBSITE_DOMAIN')}" class="navbar-brand"><b>Api</b>Admin</a> - <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse"> - <i class="fa fa-bars"></i> - </button> - </div> - <div class="collapse navbar-collapse pull-left" id="navbar-collapse"> - <ul class="nav navbar-nav"> - {block name="nav"}{/block} - </ul> - </div> - </div> - </nav> - </header> - <div class="content-wrapper"> - <div class="container"> - <section class="content" style="width: 80%"> - {block name="main"}{/block} - </section> - </div> - </div> - <footer class="main-footer"> - <div class="container"> - <div class="pull-right hidden-xs"> - <b>Version</b> {:config('PRODUCT_VERSION')} - </div> - <strong>Copyright © 2015-{:date('Y')} Copyright © 2014-{:date('Y')} <a href="{:config('WEBSITE_DOMAIN')}">{:config('COMPANY_NAME')}</a>.</strong> All rights - reserved. - </div> - </footer> -</div> - -<!-- jQuery 2.2.3 --> -<script src="__PLUGIN__/jQuery/2.2.4/jquery.min.js"></script> -<!-- Bootstrap 3.3.6 --> -<script src="__PLUGIN__/bootstrap/js/bootstrap.min.js"></script> -<!-- FastClick --> -<script src="__PLUGIN__/fastClick/fastclick.js"></script> -<!-- slimScroll --> -<script src="__PLUGIN__/slimScroll/jquery.slimscroll.min.js"></script> -<!-- BootBox --> -<script src="__PLUGIN__/bootBox/bootbox.min.js"></script> -<!-- AdminLTE App --> -<script src="__JS__/app.min.js"></script> -<!-- AdminLTE for demo purposes --> -<script src="__JS__/demo.js"></script> -<script src="__JS__/template.js"></script> -</body> -</html> diff --git a/application/install/view/public/jump.html b/application/install/view/public/jump.html deleted file mode 100644 index 7460f53..0000000 --- a/application/install/view/public/jump.html +++ /dev/null @@ -1,63 +0,0 @@ -{__NOLAYOUT__} -<!doctype html> -<html lang="zh"> -<head> - <meta charset="UTF-8"> - <title>ApiAdmin - 跳转提示</title> - <script src="__PLUGIN__/jQuery/3.1.1/jquery.min.js"></script> - <link href="//cdn.bootcss.com/semantic-ui/2.2.6/semantic.min.css" rel="stylesheet"> - <script src="//cdn.bootcss.com/semantic-ui/2.2.6/semantic.js"></script> - <link rel="icon" href="__IMG__/favicon.ico"> -</head> -<body> - -<div class="ui card" style="text-align:center;width:40%;position: fixed;top: 20%;left: 30%"> - <?php switch ($code) {?> - <?php case 1:?> - <div class="ui green inverted segment" style="margin: 0px;"> - <i class="ui smile icon massive"></i> - </div> - <?php break;?> - <?php case 0:?> - <div class="ui red inverted segment" style="margin: 0px;"> - <i class="ui frown icon massive"></i> - </div> - <?php break;?> - <?php } ?> - <div class="content" style="line-height: 2em"> - <?php if(isset($msg)) {?> - <span class="header"><?php echo(strip_tags($msg));?></span> - <?php }else{?> - <span class="header"><?php echo($error); ?></span> - <?php }?> - <div class="meta"> - 将在<span id="left"><?php echo($wait); ?></span>S后自动跳转 - </div> - </div> - <span style="display: none" id="href"><?php echo($url); ?></span> - <div class="ui bottom attached indicating progress" id="amanege-bar"> - <div class="bar"></div> - </div> -</div> -</body> -<script type="text/javascript"> - (function(){ - var wait = 0,left = $('#left').text(); - var href = $('#href').text(); - var each = 100/left; - var interval = setInterval(function(){ - wait = wait + each; - left = left - 1; - if(wait > 100) { - location.href = href; - clearInterval(interval); - return ; - } - $('#left').text(left); - $('#amanege-bar').progress({ - percent: wait - }); - }, 1000); - })(); -</script> -</html> \ No newline at end of file diff --git a/application/tags.php b/application/tags.php deleted file mode 100644 index e213e0a..0000000 --- a/application/tags.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -// 应用行为扩展定义文件 -return [ - // 应用初始化 - 'app_init' => [], - // 应用开始 - 'app_begin' => [], - // 模块初始化 - 'module_init' => [], - // 操作开始执行 - 'action_begin' => [], - // 视图内容过滤 - 'view_filter' => [], - // 日志写入 - 'log_write' => [], - // 应用结束 - 'app_end' => [], -]; diff --git a/build.php b/build.php deleted file mode 100644 index b37d3ab..0000000 --- a/build.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -return [ - // 生成应用公共文件 - '__file__' => ['common.php', 'config.php', 'database.php'], - - // 定义demo模块的自动生成 (按照实际定义的文件名生成) - 'demo' => [ - '__file__' => ['common.php'], - '__dir__' => ['behavior', 'controller', 'model', 'view'], - 'controller' => ['Index', 'Test', 'UserType'], - 'model' => ['User', 'UserType'], - 'view' => ['index/index'], - ], - // 其他更多的模块定义 -]; diff --git a/extend/Permission.php b/extend/Permission.php deleted file mode 100644 index 5e40e7f..0000000 --- a/extend/Permission.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php - /** - * 权限认证类 - * @since 2016-08-31 - * @author zhaoxiang <zhaoxiang051405@gmail.com> - */ - - /** - * 这里的权限认证主要是针对管理员的,访客权限保存在菜单内 - * AuthGroup表中存储的rules字段的格式为 Index/index:8,User/index:6.... - * :后面的数字代表当前组对于这个URL拥有的权限细节 - * 8 的二进制表示为 00001000, 拆分成 0000 1000 - * 后面的1000 分别表示管理员的 查(GET) 增(PUT) 改(POST) 删(DELETE) 四个权限 - * 前面的0000 只是为了补位 0表示没有权限,1表示有权限 - * - * 一个用户可以存在于多个组中,如果两个组存在相同的URL权限,那么权限会叠加. - * 例:组A User/index:8 组B User/index:16 如果用户X同时处于组A和组B中,那么X的User/index权限为24(8|16) - */ - -class Permission { - - const AUTH_TYPE_NOW = 0; - const AUTH_TYPE_CACHE = 1; - const AUTH_TYPE_SESSION = 2; - - /** - * 权限位定义 - */ - const AUTH_GET = 8; - const AUTH_PUT = 4; - const AUTH_POST = 2; - const AUTH_DELETE = 1; - - protected $_config = [ - 'AUTH_ON' => true, //认证开关 - 'AUTH_TYPE' => 0, //认证方式,0为时时认证;1为登录认证[Cache缓存];2为登录认证[SESSION缓存]。 - 'AUTH_GROUP' => 'auth_group', //用户组数据表名 - 'AUTH_GROUP_ACCESS' => 'auth_group_access', //用户组明细表 - 'AUTH_RULE' => 'auth_rule', //权限规则表 - 'AUTH_USER' => 'user' //用户信息表 - ]; - - public function __construct() { - foreach ( $this->_config as $key => $value ){ - $confValue = config($key); - if( !is_null($confValue) ){ - $this->_config[$key] = $confValue; - } - } - } - - /** - * 权限检测 - * @param string | array $name 获得权限 可以是字符串或数组或逗号分割,只要数组中有一个条件通过则通过 - * @param string $uid 认证的用户id - * @param string $rule 认证的规则,如果有值,那么将不会去检测用户组等信息 - * @return int - */ - public function check($name, $uid, $rule = '') { - - if (!$this->_config['AUTH_ON']){ - return true; - } - - if (!empty($rule) && empty($uid)){ - $authList[$name] = $rule; - }else{ - $authList = $this->getAuthList($uid); - } - - $method = $_SERVER['REQUEST_METHOD']; - switch ( strtoupper($method) ){ - case 'GET': - $action = self::AUTH_GET; - break; - case 'PUT': - $action = self::AUTH_PUT; - break; - case 'POST': - $action = self::AUTH_POST; - break; - case 'DELETE': - $action = self::AUTH_DELETE; - break; - default: - $action = 0; - break; - } - $authList[$name] = isset($authList[$name])?$authList[$name]:0; - return $authList[$name] & $action; - - } - - /** - * 获取用户组信息 - * @param $uid - * @return mixed - */ - protected function getGroups( $uid ) { - static $groups = array(); - if ( isset($groups[$uid]) ) { - return $groups[$uid]; - } - $userGroups = \think\Db::table(config('database')['prefix'].$this->_config['AUTH_GROUP_ACCESS'])->where(['uid' => $uid])->select(); - if( !empty($userGroups) ){ - $groups[$uid] = []; - foreach( $userGroups as $value ){ - $groupInfo = \think\Db::table(config('database')['prefix'].$this->_config['AUTH_GROUP'])->where(['id' => $value['groupId']])->find(); - if( !is_null($groupInfo) ){ - if( $groupInfo['status'] != 1 ){ - continue; - }else{ - $groups[$uid][] = $value['groupId']; - } - } - } - return $groups[$uid]; - }else{ - return []; - } - } - - /** - * 获取权限列表 - * @param $uid - * @return array - */ - public function getAuthList( $uid ) { - static $_authList = []; - if (isset($_authList[$uid])) { - return $_authList[$uid]; - } elseif ($this->_config['AUTH_TYPE'] == self::AUTH_TYPE_SESSION){ - if(isset($_SESSION[$uid]['_AUTH_LIST_'])){ - return $_SESSION[$uid]['_AUTH_LIST_']; - } - } elseif ( $this->_config['AUTH_TYPE'] == self::AUTH_TYPE_CACHE ){ - $authList = cache('AuthList:' . $uid); - if( $authList ){ - return cache('AuthList:' . $uid); - } - } - - $groups = $this->getGroups($uid); - if ( empty($groups) ) { - $_authList[$uid] = []; - return []; - } - - $authList = []; - foreach ($groups as $g) { - $groupRule = \think\Db::table(config('database')['prefix'].$this->_config['AUTH_RULE'])->where(['groupId' => $g])->select(); - if( !empty($groupRule) ){ - foreach ( $groupRule as $groupValue ){ - if( isset($authList[$groupValue['url']]) ){ - $authList[$groupValue['url']] = $authList[$groupValue['url']] | $groupValue['auth']; - }else{ - $authList[$groupValue['url']] = $groupValue['auth']; - } - } - } - } - - $_authList[$uid] = $authList; - if($this->_config['AUTH_TYPE'] == self::AUTH_TYPE_SESSION){ - $_SESSION[$uid]['_AUTH_LIST_'] = $authList; - } elseif ( $this->_config['AUTH_TYPE'] == self::AUTH_TYPE_CACHE ){ - cache('AuthList:' . $uid, $authList); - } - return $_authList[$uid]; - } - -} diff --git a/extend/index.html b/extend/index.html deleted file mode 100644 index e69de29..0000000 diff --git a/public/admin/index.php b/index.php similarity index 54% rename from public/admin/index.php rename to index.php index be2ab65..10d1083 100644 --- a/public/admin/index.php +++ b/index.php @@ -2,20 +2,25 @@ // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. +// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- +// 应用入口文件 + +// 检测PHP环境 +if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); + +// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false +define('APP_DEBUG',True); + // 定义应用目录 -define('APP_PATH', __DIR__ . '/../../application/'); -// [ 应用入口文件 ] -if(file_exists(APP_PATH .'extra' . DIRECTORY_SEPARATOR . 'install.lock') === false){ - define('BIND_MODULE','install'); -}else{ - define('BIND_MODULE','admin'); -} -// 加载框架引导文件 -require __DIR__ . '/../../thinkphp/start.php'; +define('APP_PATH','./Application/'); + +// 引入ThinkPHP入口文件 +require './ThinkPHP/ThinkPHP.php'; + +// 亲^_^ 后面不需要任何代码了 就是如此简单 \ No newline at end of file diff --git a/public/admin/.htaccess b/public/admin/.htaccess deleted file mode 100644 index f750eee..0000000 --- a/public/admin/.htaccess +++ /dev/null @@ -1,8 +0,0 @@ -<IfModule mod_rewrite.c> - Options +FollowSymlinks -Multiviews - RewriteEngine On - - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php/?$1 [QSA,PT,L] -</IfModule> diff --git a/public/admin/static/css/AdminLTE.min.css b/public/admin/static/css/AdminLTE.min.css deleted file mode 100644 index 088e9e1..0000000 --- a/public/admin/static/css/AdminLTE.min.css +++ /dev/null @@ -1,7 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);/*! - * AdminLTE v2.3.7 - * Author: Almsaeed Studio - * Website: Almsaeed Studio <http://almsaeedstudio.com> - * License: Open source - MIT - * Please visit http://opensource.org/licenses/MIT for more information -!*/html,body{min-height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{min-height:100%;position:relative;overflow:hidden}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed} .content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820} .layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}} .content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800} .main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de} .fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed} .fixed .main-header{top:0;right:0;left:0} .fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}} .fixed.layout-boxed .wrapper{max-width:100%} body.hold-transition .content-wrapper,body.hold-transition .right-side,body.hold-transition .main-footer,body.hold-transition .main-sidebar,body.hold-transition .left-side,body.hold-transition .main-header .navbar,body.hold-transition .main-header .logo{-webkit-transition:none;-o-transition:none;transition:none} .content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px} h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif} a{color:#3c8dbc} a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2} .page-header{margin:10px 0 20px 0;font-size:22px} .page-header>small{color:#666;display:block;margin-top:5px} .main-header{position:relative;max-height:100px;z-index:1030} .main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0} .layout-top-nav .main-header .navbar{margin-left:0} .main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent} .main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)} .main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1} .main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc} .main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc} .main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}} .main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome} .main-header .sidebar-toggle:before{content:"\f0c9"} .main-header .sidebar-toggle:hover{color:#fff} .main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent} .main-header .sidebar-toggle .icon-bar{display:none} .main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px} .main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9} .main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden} .main-header .logo .logo-lg{display:block} .main-header .logo .logo-mini{display:none} .main-header .navbar-brand{color:#fff} .content-header{position:relative;padding:15px 15px 0 15px} .content-header>h1{margin:0;font-size:24px} .content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300} .content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px} .content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block} .content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px} .content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}} .navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none !important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}} .main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}} .sidebar{padding-bottom:10px} .sidebar-form input:focus{border-color:transparent} .user-panel{position:relative;width:100%;padding:10px;overflow:hidden} .user-panel:before,.user-panel:after{content:" ";display:table} .user-panel:after{clear:both} .user-panel>.image>img{width:100%;max-width:45px;height:auto} .user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px} .user-panel>.info>p{font-weight:600;margin-bottom:9px} .user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px} .user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px} .sidebar-menu{list-style:none;margin:0;padding:0} .sidebar-menu>li{position:relative;margin:0;padding:0} .sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block} .sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px} .sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px} .sidebar-menu>li .badge{margin-top:3px} .sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px} .sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px} .sidebar-menu li.active>a>.fa-angle-left,.sidebar-menu li.active>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)} .sidebar-menu li.active>.treeview-menu{display:block} .sidebar-menu .treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px} .sidebar-menu .treeview-menu .treeview-menu{padding-left:20px} .sidebar-menu .treeview-menu>li{margin:0} .sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px} .sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px} .sidebar-menu .treeview-menu>li>a>.pull-right-container>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.pull-right-container>.fa-angle-down,.sidebar-menu .treeview-menu>li>a>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.fa-angle-down{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px !important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px !important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block !important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{float:right;width:auto!important;left:200px!important;top:10px!important}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none !important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}} .sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden} .sidebar-menu:hover{overflow:visible} .sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip} .sidebar-menu li>a{position:relative} .sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px} .control-sidebar-bg{position:fixed;z-index:1000;bottom:0} .control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out} .control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}} .control-sidebar>.tab-content{padding:10px 15px} .control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0} .control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}} .nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0} .nav-tabs.control-sidebar-tabs>li>a{border-radius:0} .nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent} .nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px} .nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}} .control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px} .control-sidebar-subheading{display:block;font-weight:400;font-size:14px} .control-sidebar-menu{list-style:none;padding:0;margin:0 -15px} .control-sidebar-menu>li>a{display:block;padding:10px 15px} .control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table} .control-sidebar-menu>li>a:after{clear:both} .control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0} .control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px} .control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px} .control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0} .control-sidebar-menu .menu-info>p{margin:0;font-size:11px} .control-sidebar-menu .progress{margin:0} .control-sidebar-dark{color:#b8c7ce} .control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32} .control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529} .control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce} .control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d} .control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529} .control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff} .control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff} .control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff} .control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c} .control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce} .control-sidebar-light{color:#5e5e5e} .control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de} .control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de} .control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444} .control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de} .control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7} .control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111} .control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111} .control-sidebar-light .control-sidebar-menu{margin-left:-14px} .control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5} .control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e} .dropdown-menu{box-shadow:none;border-color:#eee} .dropdown-menu>li>a{color:#777} .dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px} .dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333} .dropdown-menu>.divider{background-color:#eee} .navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%} .navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative} .navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px} .navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444 !important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff !important;color:#444 !important}} .navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal} .navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden} .navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4} .navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none} .navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;padding:10px} .navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px} .navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px} .navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px} .navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative} .navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0} .navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888} .navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table} .navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both} .navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px} .navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666} .navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0} .navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px} .navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px} .navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center} .navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)} .navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px} .navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px} .navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd} .navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table} .navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both} .navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}} .navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px} .navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table} .navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both} .navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}} .navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}} .open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both} @keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}} @-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}} .navbar-custom-menu>.navbar-nav>li{position:relative} .navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}} .form-control{border-radius:0;box-shadow:none;border-color:#d2d6de} .form-control:focus{border-color:#3c8dbc;box-shadow:none} .form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1} .form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none} .form-group.has-success label{color:#00a65a} .form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none} .form-group.has-success .help-block{color:#00a65a} .form-group.has-warning label{color:#f39c12} .form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#f39c12;box-shadow:none} .form-group.has-warning .help-block{color:#f39c12} .form-group.has-error label{color:#dd4b39} .form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none} .form-group.has-error .help-block{color:#dd4b39} .input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff} .btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0} .icheck>label{padding-left:0} .form-control-feedback.fa{line-height:34px} .input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px} .input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px} .progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none} .progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px} .progress.sm,.progress-sm{height:10px} .progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px} .progress.xs,.progress-xs{height:7px} .progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px} .progress.xxs,.progress-xxs{height:3px} .progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px} .progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px} .progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0} .progress.vertical.sm,.progress.vertical.progress-sm{width:20px} .progress.vertical.xs,.progress.vertical.progress-xs{width:10px} .progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px} .progress-group .progress-text{font-weight:600} .progress-group .progress-number{float:right} .table tr>td .progress{margin:0} .progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc} .progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)} .progress-bar-green,.progress-bar-success{background-color:#00a65a} .progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)} .progress-bar-aqua,.progress-bar-info{background-color:#00c0ef} .progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)} .progress-bar-yellow,.progress-bar-warning{background-color:#f39c12} .progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)} .progress-bar-red,.progress-bar-danger{background-color:#dd4b39} .progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)} .small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)} .small-box>.inner{padding:10px} .small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none} .small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)} .small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0} .small-box p{font-size:15px} .small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px} .small-box h3,.small-box p{z-index:5} .small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)} .small-box:hover{text-decoration:none;color:#f9f9f9} .small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}} .box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)} .box.box-primary{border-top-color:#3c8dbc} .box.box-info{border-top-color:#00c0ef} .box.box-danger{border-top-color:#dd4b39} .box.box-warning{border-top-color:#f39c12} .box.box-success{border-top-color:#00a65a} .box.box-default{border-top-color:#d2d6de} .box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none} .box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0} .box .nav-stacked>li:last-of-type{border-bottom:none} .box.height-control .box-body{max-height:300px;overflow:auto} .box .border-right{border-right:1px solid #f4f4f4} .box .border-left{border-left:1px solid #f4f4f4} .box.box-solid{border-top:0} .box.box-solid>.box-header .btn.btn-default{background:transparent} .box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)} .box.box-solid.box-default{border:1px solid #d2d6de} .box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de} .box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444} .box.box-solid.box-primary{border:1px solid #3c8dbc} .box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc} .box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff} .box.box-solid.box-info{border:1px solid #00c0ef} .box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef} .box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff} .box.box-solid.box-danger{border:1px solid #dd4b39} .box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39} .box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff} .box.box-solid.box-warning{border:1px solid #f39c12} .box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12} .box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff} .box.box-solid.box-success{border:1px solid #00a65a} .box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a} .box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff} .box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none} .box.box-solid[class*='bg']>.box-header{color:#fff} .box .box-group>.box{margin-bottom:5px} .box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em} .box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%} .box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px} .box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px} .box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)} .box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table} .box-header:after,.box-body:after,.box-footer:after{clear:both} .box-header{color:#444;display:block;padding:10px;position:relative} .box-header.with-border{border-bottom:1px solid #f4f4f4} .collapsed-box .box-header.with-border{border-bottom:none} .box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1} .box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px} .box-header>.box-tools{position:absolute;right:10px;top:5px} .box-header>.box-tools [data-toggle="tooltip"]{position:relative} .box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto} .btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3} .open .btn-box-tool,.btn-box-tool:hover{color:#606c84} .btn-box-tool.btn:active{box-shadow:none} .box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px} .no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px} .box-body>.table{margin-bottom:0} .box-body .fc{margin-top:5px} .box-body .full-width-chart{margin:-19px} .box-body.no-padding .full-width-chart{margin:-9px} .box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px} .box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0} .box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff} .chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}} .box-comments{background:#f7f7f7} .box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee} .box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table} .box-comments .box-comment:after{clear:both} .box-comments .box-comment:last-of-type{border-bottom:0} .box-comments .box-comment:first-of-type{padding-top:0} .box-comments .box-comment img{float:left} .box-comments .comment-text{margin-left:40px;color:#555} .box-comments .username{color:#444;display:block;font-weight:600} .box-comments .text-muted{font-weight:400;font-size:12px} .todo-list{margin:0;padding:0;list-style:none;overflow:auto} .todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444} .todo-list>li:last-of-type{margin-bottom:0} .todo-list>li>input[type='checkbox']{margin:0 10px 0 5px} .todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600} .todo-list>li .label{margin-left:10px;font-size:9px} .todo-list>li .tools{display:none;float:right;color:#dd4b39} .todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer} .todo-list>li:hover .tools{display:inline-block} .todo-list>li.done{color:#999} .todo-list>li.done .text{text-decoration:line-through;font-weight:500} .todo-list>li.done .label{background:#d2d6de !important} .todo-list .danger{border-left-color:#dd4b39} .todo-list .warning{border-left-color:#f39c12} .todo-list .info{border-left-color:#00c0ef} .todo-list .success{border-left-color:#00a65a} .todo-list .primary{border-left-color:#3c8dbc} .todo-list .handle{display:inline-block;cursor:move;margin:0 5px} .chat{padding:5px 20px 5px 10px} .chat .item{margin-bottom:10px} .chat .item:before,.chat .item:after{content:" ";display:table} .chat .item:after{clear:both} .chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%} .chat .item>.online{border:2px solid #00a65a} .chat .item>.offline{border:2px solid #dd4b39} .chat .item>.message{margin-left:55px;margin-top:-40px} .chat .item>.message>.name{display:block;font-weight:600} .chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px} .chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px} .chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0} .chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table} .chat .item>.attachment:after{clear:both} .box-input{max-width:200px} .modal .panel-body{color:#444} .info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px} .info-box small{font-size:14px} .info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px} .info-box .progress,.info-box .progress .progress-bar{border-radius:0} .info-box .progress .progress-bar{background:#fff} .info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)} .info-box-icon>img{max-width:100%} .info-box-content{padding:5px 10px;margin-left:90px} .info-box-number{display:block;font-weight:bold;font-size:18px} .progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .info-box-text{text-transform:uppercase} .info-box-more{display:block} .progress-description{margin:0} .timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none} .timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px} .timeline>li{position:relative;margin-right:10px;margin-bottom:15px} .timeline>li:before,.timeline>li:after{content:" ";display:table} .timeline>li:after{clear:both} .timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative} .timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px} .timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1} .timeline>li>.timeline-item>.timeline-header>a{font-weight:600} .timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px} .timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0} .timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px} .timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none} .timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd} .btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent} .btn.uppercase{text-transform:uppercase} .btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px} .btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)} .btn:focus{outline:none} .btn.btn-file{position:relative;overflow:hidden} .btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block} .btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd} .btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7} .btn-primary{background-color:#3c8dbc;border-color:#367fa9} .btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9} .btn-success{background-color:#00a65a;border-color:#008d4c} .btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c} .btn-info{background-color:#00c0ef;border-color:#00acd6} .btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6} .btn-danger{background-color:#dd4b39;border-color:#d73925} .btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925} .btn-warning{background-color:#f39c12;border-color:#e08e0b} .btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b} .btn-outline{border:1px solid #fff;background:transparent;color:#fff} .btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)} .btn-link{-webkit-box-shadow:none;box-shadow:none} .btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)} .btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px} .btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block} .btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa} .btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)} .btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400} .callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee} .callout a{color:#fff;text-decoration:underline} .callout a:hover{color:#eee} .callout h4{margin-top:0;font-weight:600} .callout p:last-child{margin-bottom:0} .callout code,.callout .highlight{background-color:#fff} .callout.callout-danger{border-color:#c23321} .callout.callout-warning{border-color:#c87f0a} .callout.callout-info{border-color:#0097bc} .callout.callout-success{border-color:#00733e} .alert{border-radius:3px} .alert h4{font-weight:600} .alert .icon{margin-right:10px} .alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)} .alert .close:hover{opacity:.5;filter:alpha(opacity=50)} .alert a{color:#fff;text-decoration:underline} .alert-success{border-color:#008d4c} .alert-danger,.alert-error{border-color:#d73925} .alert-warning{border-color:#e08e0b} .alert-info{border-color:#00acd6} .nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7} .nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444} .nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px} .nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc} .nav-pills>li.active>a{font-weight:600} .nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444} .nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc} .nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase} .nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px} .nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px} .nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px} .nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0} .nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999} .nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0} .nav-tabs-custom>.nav-tabs>li>a:hover{color:#999} .nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent} .nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc} .nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444} .nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4} .nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0} .nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent} .nav-tabs-custom>.nav-tabs.pull-right{float:none !important} .nav-tabs-custom>.nav-tabs.pull-right>li{float:right} .nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0} .nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px} .nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent} .nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444} .nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px} .nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px} .nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999} .nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc} .nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef} .nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39} .nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12} .nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a} .nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de} .pagination>li>a{background:#fafafa;color:#666} .pagination.pagination-flat>li>a{border-radius:0 !important} .products-list{list-style:none;margin:0;padding:0} .products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff} .products-list>.item:before,.products-list>.item:after{content:" ";display:table} .products-list>.item:after{clear:both} .products-list .product-img{float:left} .products-list .product-img img{width:50px;height:50px} .products-list .product-info{margin-left:60px} .products-list .product-title{font-weight:600} .products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} .product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4} .product-list-in-box>.item:last-of-type{border-bottom-width:0} .table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4} .table>thead>tr>th{border-bottom:2px solid #f4f4f4} .table tr td .progress{margin-top:5px} .table-bordered{border:1px solid #f4f4f4} .table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4} .table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px} .table.no-border,.table.no-border td,.table.no-border th{border:0} table.text-center,table.text-center td,table.text-center th{text-align:center} .table.align th{text-align:left} .table.align td{text-align:right} .label-default{background-color:#d2d6de;color:#444} .direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0} .direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)} .direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto} .direct-chat-msg,.direct-chat-text{display:block} .direct-chat-msg{margin-bottom:10px} .direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table} .direct-chat-msg:after{clear:both} .direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out} .direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444} .direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none} .direct-chat-text:after{border-width:5px;margin-top:-5px} .direct-chat-text:before{border-width:6px;margin-top:-6px} .right .direct-chat-text{margin-right:50px;margin-left:0} .right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de} .direct-chat-img{border-radius:50%;float:left;width:40px;height:40px} .right .direct-chat-img{float:right} .direct-chat-info{display:block;margin-bottom:2px;font-size:12px} .direct-chat-name{font-weight:600} .direct-chat-timestamp{color:#999} .direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)} .direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto} .contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0} .contacts-list>li:before,.contacts-list>li:after{content:" ";display:table} .contacts-list>li:after{clear:both} .contacts-list>li:last-of-type{border-bottom:none} .contacts-list-img{border-radius:50%;width:40px;float:left} .contacts-list-info{margin-left:45px;color:#fff} .contacts-list-name,.contacts-list-status{display:block} .contacts-list-name{font-weight:600} .contacts-list-status{font-size:12px} .contacts-list-date{color:#aaa;font-weight:normal} .contacts-list-msg{color:#999} .direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff} .direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39} .direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff} .direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc} .direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff} .direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12} .direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff} .direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef} .direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff} .direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a} .users-list>li{width:25%;float:left;padding:10px;text-align:center} .users-list>li img{border-radius:50%;max-width:100%;height:auto} .users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999} .users-list-name,.users-list-date{display:block} .users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} .users-list-date{color:#999;font-size:12px} .carousel-control.left,.carousel-control.right{background-image:none} .carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px} .modal{background:rgba(0,0,0,0.3)} .modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}} .modal-header{border-bottom-color:#f4f4f4} .modal-footer{border-top-color:#f4f4f4} .modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095} .modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a} .modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc} .modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e} .modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321} .box-widget{border:none;position:relative} .widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px} .widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)} .widget-user .widget-user-desc{margin-top:0} .widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px} .widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff} .widget-user .box-footer{padding-top:30px} .widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px} .widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300} .widget-user-2 .widget-user-desc{margin-top:0} .widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px} .widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left} .mailbox-messages>.table{margin:0} .mailbox-controls{padding:5px} .mailbox-controls.with-border{border-bottom:1px solid #f4f4f4} .mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px} .mailbox-read-info h3{font-size:20px;margin:0} .mailbox-read-info h5{margin:0;padding:5px 0 0 0} .mailbox-read-time{color:#999;font-size:13px} .mailbox-read-message{padding:10px} .mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px} .mailbox-attachment-name{font-weight:bold;color:#666} .mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block} .mailbox-attachment-info{padding:10px;background:#f4f4f4} .mailbox-attachment-size{color:#999;font-size:12px} .mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px} .mailbox-attachment-icon.has-img{padding:0} .mailbox-attachment-icon.has-img>img{max-width:100%;height:auto} .lockscreen{background:#d2d6de} .lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300} .lockscreen-logo a{color:#444} .lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%} .lockscreen .lockscreen-name{text-align:center;font-weight:600} .lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px} .lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10} .lockscreen-image>img{border-radius:50%;width:70px;height:70px} .lockscreen-credentials{margin-left:70px} .lockscreen-credentials .form-control{border:0} .lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px} .lockscreen-footer{margin-top:10px} .login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300} .login-logo a,.register-logo a{color:#444} .login-page,.register-page{background:#d2d6de} .login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}} .login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666} .login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777} .login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px} .social-auth-links{margin:10px 0} .error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}} .error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}} .error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}} .error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}} .invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px} .invoice-title{margin-top:0} .profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de} .profile-username{font-size:21px;margin-top:5px} .post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666} .post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0} .post .user-block{margin-bottom:15px} .btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)} .btn-social.btn-lg{padding-left:61px} .btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em} .btn-social.btn-sm{padding-left:38px} .btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em} .btn-social.btn-xs{padding-left:30px} .btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em} .btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0} .btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)} .btn-social-icon.btn-lg{padding-left:61px} .btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em} .btn-social-icon.btn-sm{padding-left:38px} .btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em} .btn-social-icon.btn-xs{padding-left:30px} .btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em} .btn-social-icon>:first-child{border:none;text-align:center;width:100%} .btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0} .btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0} .btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0} .btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)} .btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)} .btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)} .btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)} .btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none} .btn-adn .badge{color:#d87a68;background-color:#fff} .btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)} .btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)} .btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)} .btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)} .btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none} .btn-bitbucket .badge{color:#205081;background-color:#fff} .btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)} .btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)} .btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)} .btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)} .btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none} .btn-dropbox .badge{color:#1087dd;background-color:#fff} .btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)} .btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)} .btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)} .btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)} .btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none} .btn-facebook .badge{color:#3b5998;background-color:#fff} .btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)} .btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)} .btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)} .btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)} .btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none} .btn-flickr .badge{color:#ff0084;background-color:#fff} .btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)} .btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)} .btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)} .btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)} .btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none} .btn-foursquare .badge{color:#f94877;background-color:#fff} .btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)} .btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)} .btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)} .btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)} .btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none} .btn-github .badge{color:#444;background-color:#fff} .btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)} .btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)} .btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)} .btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)} .btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none} .btn-google .badge{color:#dd4b39;background-color:#fff} .btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)} .btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)} .btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)} .btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)} .btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none} .btn-instagram .badge{color:#3f729b;background-color:#fff} .btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)} .btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)} .btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)} .btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)} .btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none} .btn-linkedin .badge{color:#007bb6;background-color:#fff} .btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)} .btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)} .btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)} .btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)} .btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none} .btn-microsoft .badge{color:#2672ec;background-color:#fff} .btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)} .btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)} .btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)} .btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)} .btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none} .btn-openid .badge{color:#f7931e;background-color:#fff} .btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)} .btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)} .btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)} .btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)} .btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none} .btn-pinterest .badge{color:#cb2027;background-color:#fff} .btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)} .btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)} .btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)} .btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)} .btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none} .btn-reddit .badge{color:#eff7ff;background-color:#000} .btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)} .btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)} .btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)} .btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)} .btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none} .btn-soundcloud .badge{color:#f50;background-color:#fff} .btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)} .btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)} .btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)} .btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)} .btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none} .btn-tumblr .badge{color:#2c4762;background-color:#fff} .btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)} .btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)} .btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)} .btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)} .btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none} .btn-twitter .badge{color:#55acee;background-color:#fff} .btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)} .btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)} .btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)} .btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)} .btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none} .btn-vimeo .badge{color:#1ab7ea;background-color:#fff} .btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)} .btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)} .btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)} .btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)} .btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none} .btn-vk .badge{color:#587ea3;background-color:#fff} .btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)} .btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)} .btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)} .btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)} .btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none} .btn-yahoo .badge{color:#720e9e;background-color:#fff} .fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd} .fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9} .fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px} .fc-header-right{padding-right:10px} .fc-header-left{padding-left:10px} .fc-widget-header{background:#fafafa} .fc-grid{width:100%;border:0} .fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0} .fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0} .fc-toolbar{padding:10px;margin:0} .fc-day-number{font-size:20px;font-weight:300;padding-right:10px} .fc-color-picker{list-style:none;margin:0;padding:0} .fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px} .fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s} .fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)} #add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s} .external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move} .external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)} .select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none} .select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px} .select2-container--default.select2-container--open{border-color:#3c8dbc} .select2-dropdown{border:1px solid #d2d6de;border-radius:0} .select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white} .select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none} .select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px} .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px} .select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px} .select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0} .select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de} .select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc} .select2-container--default .select2-results__option[aria-disabled=true]{color:#999} .select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd} .select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444} .select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0} .select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc} .select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de} .select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff} .select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)} .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff} .select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px} .pad{padding:10px} .margin{margin:10px} .margin-bottom{margin-bottom:20px} .margin-bottom-none{margin-bottom:0} .margin-r-5{margin-right:5px} .inline{display:inline} .description-block{display:block;margin:10px 0;text-align:center} .description-block.margin-bottom{margin-bottom:25px} .description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px} .description-block>.description-text{text-transform:uppercase} .bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important} .bg-gray{color:#000;background-color:#d2d6de !important} .bg-gray-light{background-color:#f7f7f7} .bg-black{background-color:#111 !important} .bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important} .bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important} .bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important} .bg-blue{background-color:#0073b7 !important} .bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important} .bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important} .bg-navy{background-color:#001f3f !important} .bg-teal{background-color:#39cccc !important} .bg-olive{background-color:#3d9970 !important} .bg-lime{background-color:#01ff70 !important} .bg-orange{background-color:#ff851b !important} .bg-fuchsia{background-color:#f012be !important} .bg-purple{background-color:#605ca8 !important} .bg-maroon{background-color:#d81b60 !important} .bg-gray-active{color:#000;background-color:#b5bbc8 !important} .bg-black-active{background-color:#000 !important} .bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important} .bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important} .bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important} .bg-blue-active{background-color:#005384 !important} .bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important} .bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important} .bg-navy-active{background-color:#001a35 !important} .bg-teal-active{background-color:#30bbbb !important} .bg-olive-active{background-color:#368763 !important} .bg-lime-active{background-color:#00e765 !important} .bg-orange-active{background-color:#ff7701 !important} .bg-fuchsia-active{background-color:#db0ead !important} .bg-purple-active{background-color:#555299 !important} .bg-maroon-active{background-color:#ca195a !important} [class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)} .text-red{color:#dd4b39 !important} .text-yellow{color:#f39c12 !important} .text-aqua{color:#00c0ef !important} .text-blue{color:#0073b7 !important} .text-black{color:#111 !important} .text-light-blue{color:#3c8dbc !important} .text-green{color:#00a65a !important} .text-gray{color:#d2d6de !important} .text-navy{color:#001f3f !important} .text-teal{color:#39cccc !important} .text-olive{color:#3d9970 !important} .text-lime{color:#01ff70 !important} .text-orange{color:#ff851b !important} .text-fuchsia{color:#f012be !important} .text-purple{color:#605ca8 !important} .text-maroon{color:#d81b60 !important} .link-muted{color:#7a869d} .link-muted:hover,.link-muted:focus{color:#606c84} .link-black{color:#666} .link-black:hover,.link-black:focus{color:#999} .hide{display:none !important} .no-border{border:0 !important} .no-padding{padding:0 !important} .no-margin{margin:0 !important} .no-shadow{box-shadow:none !important} .list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0} .list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0} .flat{border-radius:0 !important} .text-bold,.text-bold.table td,.text-bold.table th{font-weight:700} .text-sm{font-size:12px} .jqstooltip{padding:5px !important;width:auto !important;height:auto !important} .bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff} .bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff} .bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff} .bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff} .bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff} .bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff} .bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff} .bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff} .bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff} .bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff} .description-block .description-icon{font-size:16px} .no-pad-top{padding-top:0} .position-static{position:static !important} .list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666} .list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0} .list-link>a{padding:4px;color:#777} .list-link>a:hover{color:#222} .font-light{font-weight:300} .user-block:before,.user-block:after{content:" ";display:table} .user-block:after{clear:both} .user-block img{width:40px;height:40px;float:left} .user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px} .user-block .username{font-size:16px;font-weight:600} .user-block .description{color:#999;font-size:13px} .user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px} .user-block.user-block-sm .username{font-size:14px} .img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left} .img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px !important;height:30px !important} .img-sm+.img-push{margin-left:40px} .img-md{width:60px;height:60px} .img-md+.img-push{margin-left:70px} .img-lg{width:100px;height:100px} .img-lg+.img-push{margin-left:110px} .img-bordered{border:3px solid #d2d6de;padding:3px} .img-bordered-sm{border:2px solid #d2d6de;padding:2px} .attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7} .attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left} .attachment-block .attachment-pushed{margin-left:110px} .attachment-block .attachment-heading{margin:0} .attachment-block .attachment-text{color:#555} .connectedSortable{min-height:100px} .ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px} .sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px} .full-opacity-hover{opacity:.65;filter:alpha(opacity=65)} .full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)} .chart{position:relative;overflow:hidden;width:100%} .chart svg,.chart canvas{width:100% !important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none !important}.content-wrapper,.right-side,.main-footer{margin-left:0 !important;min-height:0 !important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0 !important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal !important}} \ No newline at end of file diff --git a/public/admin/static/css/skins/_all-skins.min.css b/public/admin/static/css/skins/_all-skins.min.css deleted file mode 100644 index e1d2398..0000000 --- a/public/admin/static/css/skins/_all-skins.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .content-wrapper,.skin-black-light .main-footer{border-left:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .treeview-menu>li>a{color:#777}.skin-black-light .treeview-menu>li.active>a,.skin-black-light .treeview-menu>li>a:hover{color:#000}.skin-black-light .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-black-light.min.css b/public/admin/static/css/skins/skin-black-light.min.css deleted file mode 100644 index 5f5894c..0000000 --- a/public/admin/static/css/skins/skin-black-light.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .content-wrapper,.skin-black-light .main-footer{border-left:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .treeview-menu>li>a{color:#777}.skin-black-light .treeview-menu>li.active>a,.skin-black-light .treeview-menu>li>a:hover{color:#000}.skin-black-light .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-black.min.css b/public/admin/static/css/skins/skin-black.min.css deleted file mode 100644 index 42a2224..0000000 --- a/public/admin/static/css/skins/skin-black.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-blue-light.min.css b/public/admin/static/css/skins/skin-blue-light.min.css deleted file mode 100644 index c41ca33..0000000 --- a/public/admin/static/css/skins/skin-blue-light.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-blue.min.css b/public/admin/static/css/skins/skin-blue.min.css deleted file mode 100644 index 44524fe..0000000 --- a/public/admin/static/css/skins/skin-blue.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-green-light.min.css b/public/admin/static/css/skins/skin-green-light.min.css deleted file mode 100644 index 7d26a13..0000000 --- a/public/admin/static/css/skins/skin-green-light.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-green.min.css b/public/admin/static/css/skins/skin-green.min.css deleted file mode 100644 index c331d6d..0000000 --- a/public/admin/static/css/skins/skin-green.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-purple-light.min.css b/public/admin/static/css/skins/skin-purple-light.min.css deleted file mode 100644 index d8389dd..0000000 --- a/public/admin/static/css/skins/skin-purple-light.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-purple.min.css b/public/admin/static/css/skins/skin-purple.min.css deleted file mode 100644 index 8989118..0000000 --- a/public/admin/static/css/skins/skin-purple.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-red-light.min.css b/public/admin/static/css/skins/skin-red-light.min.css deleted file mode 100644 index 106940c..0000000 --- a/public/admin/static/css/skins/skin-red-light.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-red.min.css b/public/admin/static/css/skins/skin-red.min.css deleted file mode 100644 index ecfb406..0000000 --- a/public/admin/static/css/skins/skin-red.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-yellow-light.min.css b/public/admin/static/css/skins/skin-yellow-light.min.css deleted file mode 100644 index 6136284..0000000 --- a/public/admin/static/css/skins/skin-yellow-light.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/public/admin/static/css/skins/skin-yellow.min.css b/public/admin/static/css/skins/skin-yellow.min.css deleted file mode 100644 index b251e24..0000000 --- a/public/admin/static/css/skins/skin-yellow.min.css +++ /dev/null @@ -1 +0,0 @@ -.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/public/admin/static/img/boxed-bg.jpg b/public/admin/static/img/boxed-bg.jpg deleted file mode 100644 index e47586abbea589bcff7d55019346167bc72b6c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123770 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 diff --git a/public/admin/static/img/boxed-bg.png b/public/admin/static/img/boxed-bg.png deleted file mode 100644 index 2f9f1ad08473dcf728044895fd7809749e38eb9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43694 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 diff --git a/public/admin/static/img/default-50x50.gif b/public/admin/static/img/default-50x50.gif deleted file mode 100644 index 2f5a14a568f04b193d6b76a4b133864462f5ae38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmZ?wbh9u|G-5Dfc+9|X>Ds;j|NsB|`RntSZ;zh7x_<l7i&yX7z5jIg!7~PIKnElU z(#yb-D{#Vd^<InDXLtWk(CACaoR_g`UC!%$1v=+Ta_?8HdtdYZzv;mS2LS;+r$rxC zC-87FFA+W^<F>e=nQ``>eOwKW!qFTJj0uH5N@Z+LGPNxEo5sy^G<k=`{^yMijZMuh Ut!?ccon75My?y-?8Uz`v0lIBb0{{R3 diff --git a/public/admin/static/img/favicon.ico b/public/admin/static/img/favicon.ico deleted file mode 100644 index d6c21662fb90a71eb168c3d6da4ab25635aa1544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc&&`%{%g7(PuuHtN9~5Hv0a1kMo@xrYb{axsOJ#Bwwl3oB`qQX4NN4kF%2(<!IS z(jmu7>VP705v456GzamPw?q_dCQ<(a@#%f`V~^)J$w7tbb3S&@?zivrUY>pTT}`GJ z<e#sviGNMI%qEk&$z%$aSB6YU@^V}~GS~kl<243MCUoQJ=;*+$n=RO1u?LIh&q4P1 zF^G$>A=uYlz41{Yn3R=<#h(<QYJWM}T5p1Dp7)`Q%a<-<<+3FhlMn@)#S<1UvwHmp zxglV1fAzAj$A|iRA}uinr7MeY?ds)c*5lsYc6?E~0wW`b!q2mxlCSYxwOSYY<*W6j zxPR~7Q@MgR&zLp|+AddkPnxG5oST{Zmhwe+lxS)^jd7{*%H}7@ecEyQFDoMn7tf#V zQiV$w&-XaC)>Z3p?aJl<)ZuRX9pp~Q7Q6e}d8OC(R7)Kgi~IMT`S9@JL#$h~T*bSm zu)317al_|MKDZ!pc{SYnR2=V0ephqk<f!OS=s3{!;-!mvly6<(bI#(`Pvr+Xq2)$1 zQsN_>Z0Ee+K-WC5Sq37=$K54gC`<1}1K*7Fq*%$5x3GKXHdy^UoMdE=OTqktSr{JV zZRdplAf5M&)+*R#TQ(to=5+XY^l^}H<idc#ZfY%MP}an8$qpE9V4gf!S%JB;-?y(N zMx5~Ar^9tvwqyZ@1q~J%%pq<VDfvDvF&eQWf+Y7_MYmUQ>i6R)DO!xg*x?e>5cQqS z;(_?6p(1~vT1y$r3K!x?eXUxn<+1&2!N<r<PqgE6e@uKW8FkeMB-b13Ena<*BWFwF z=~JkxEXSeRD(Rm@a(p;W9RCGp8vjtguV1^0IkRTq^^8Q7XLufQFB8Wmx>O&iP`QP% zr9F(t<Ovyw4DnZfVqAz%tiyHH2pQs~zN3uN6-Bsm=}$R>BC%=Xdi;I6O?(lBlP8X0 zd)fEGpK$Ci->r1an?4!LB~x=UMP45zBUEJ7R##%e*d(Qsj!i<$Fqt>bFwM(V#f7NY zy9<Hd13LBWr}X~0;gA~t?buP=ZfmvU7cQO$kG?O0ZL6Ho1^Mry{mws5_<=qHP`+m; zRu(T2yAAt^XA=%M;?w^51s|ZgYF{TO$sseMhY!K3<%L)<_e1OxJDbGkapA#Y|8X2X zRD=Ayx0Np%gg3cUCgQG~osRaC-v=djb7#M2w_oFj+x(pTpFKWB#W*B@{x=)=!ve7R zn=kR}(FPoCsFxi2rs(I6t>1l(9ox2mxJT-1q%KK8`sf%m2-h;x6JSxf+^k|*BQ|BG zjp`gT_6GewK2^p#&q?}*-_+L~6kb@A|BYA~dmuD$km8c&FuBe+g#>uQDt*Q~B|buN zVazDz6vNk%p%xYYjO1AR7%|_-OvOj}d3JoB_hD9V{J5hGKWzP0>7cP3^<dxmHS{Ci z=(rKswY^N~LGIFyZCf`hnPI`qC;D5ns^$1?u<xV%!}&0)kL0Hq*@GN^9Lx3ZK<}6B z>nMY=C{troCb?Hxu@^U*|3dP}2)hr+i|4I-968NCeNCBqoWD~OqS1P*1w4P4pU8bZ z-`g$Yw7O)e{R}?W)QH%yAozFkus88(J8N3jnEIg))~+sg@=<T<uwm^g<#&zG*2q~| zo%!KWPV7lNxF6n`mh;4V{KB~=j7^E_6)uop%t?-ZceG#kd7c?MxUN6C>l@ll>~m+& zXqYZr)`L@XvYvY%>V3z%j4QhzSEyai&~<A{R9#BnQC4^D<+ohJJ1XyRyvsey!}}-i zEUZtHC9em|IY!yqF0GHwR~%<u#(J`(=u_}M(=+$r2WV-&u4+ZrYgtk=v2M}$>`xdw a8Vl#mRyD%SmS%K3c+f4A_5TC>U+uq%KQhb! diff --git a/public/admin/static/img/icons.png b/public/admin/static/img/icons.png deleted file mode 100644 index 048c8d20d306e126535ee64c6ce2e33cd269c332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1154 zcmXw13p87I9FA2h$)#wui${ZbCCmsTq26L1%M!<9ZBM*Tbx2LogvIfQdDbwr^o%7# z=NT2n!68G{^N6C=VOZ@r!JMuhNh)m<?*6*7|2g-6zyJMx-*>;?@7|(7s;>rG4~;+| zH2nR@LE!ERE;HmQuunK?TO$xE4S|#p9||Mc+1dHM5)ODIgYuT)|Cd5>g5JY027>|M z?T6<X85sZ|<M<Q`1*qKkGWB~0EEY>wR~O1(`apqEH`@Tv1}layhv9ch7*v7K!NCEz z)zs9W;`po)IXZg|ID?XZ#~XLPluoCcnwtLiE>v8rzP`Rrq5z%TkBn;tZomi2lYlCU z!3RflYzx?tj8-C%7#0>59UX0FXXohX2<5y0KHvz*1_lPm_(#B>OeQBLCIWL*hKR%A zK&6{NOCS&cQ%_INkSjso?#I`km;;(2PlCl_0Y+zv01f*7Ig`nBa&kg4nn9bv!NHaf zq@kgq7po80Y&OUVrUa&eywweIej$)Kw@5*!KzO3fnz6UH2Z2EbbjqN)xjFE(wY5dv zd<eQTHa5oN@u;L;bn38)i3!L+B9TBlQ0@zm&C1FOhr>ZR&(Z8rFz0;prYi8+n5-ab zFk(9?eOo<A$HRlfA(`XSah$%R)V@^Ok@*dpk*226jas49C8{<`TCgtcsojV)EwCBe zi2T^Jwrm|^Lo8F)HOwiMYwLCM^NQ|9<=n$=@59wgYs!Yb!qxqbLl<RF(WRxk>uqfm zg?GpP9;I-tpi*ub8-hT5q~}le3}LUlz8f37>Y-JzG}4tkKA{smknp(POvUSOe1rUD z`d$LDVlz+6&w}IJce%IWo&}aR^i6?$v~;&xUa>`mI5gX}sn(6oA#1Kgz})3c7oYY! zjFU9dr>bAcrZlrqoGx#1C=}Uqv7p3LdPkUo{3`2}T72k|%`*25p3C6U#HAy1?3F)P z$}Ch$!d>l2jeo4~pLr}>5MDWWuySn~`Vy)WFRGHXXLo!c)-P(*2+}8?R?pS$bR}(j zZfj(bWklo^ktnC9Ud&5bxt(<0s+SNFm3Fi~)GqTyU7Z~GmZu=#zx$ayym)=~K=L_N zg2}faw5M8c!m-zjgIh;@6Wpfl$0y5kRe1p#SbcwpRyGzUHCPOYh;ZG`BrMOw9K))= z8dERqO{tPL!xj7KRig7+JB#8$(U|Tn`IOo)+I=8YTy-v-F{^<&8Xw(V#9B(|?)SfD z9c4egX4u?0pP_7e1{eL<PZu%_vpWaVOC}r?5byL)Zp>o?UZC(?%E&*exPGUz)I8=u zi>kA`;4{;5Co?WGh7%zah@SA&c*J*ia8(xs_b2=J+$(=;r_#?xH2jdDF1{MkwlLdN zxf9P{4&Y!49rz1FwWvI=XP2L3>Qo3z%W3h1ZFbu97QUyq3XZH;;Ra}A&29CiHN8b| z8hJJc<=PA#Tf0=fPI}4=vHJb5;>4F{LhJ&LPr-|0sGiM*8Ss-L{C%iofmc+{zg?g) A82|tP diff --git a/public/admin/static/img/index.html b/public/admin/static/img/index.html deleted file mode 100644 index e69de29..0000000 diff --git a/public/admin/static/img/logo.jpg b/public/admin/static/img/logo.jpg deleted file mode 100644 index bdeb1c19399647c839331b0d8e17c5e54ab8b510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20118 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 I%%a-=1FGj{Z~y=R diff --git a/public/admin/static/js/app.min.js b/public/admin/static/js/app.min.js deleted file mode 100644 index 51d5010..0000000 --- a/public/admin/static/js/app.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/*! AdminLTE app.js - * ================ - * Main JS application file for AdminLTE v2. This file - * should be included in all pages. It controls some layout - * options and implements exclusive AdminLTE plugins. - * - * @Author Almsaeed Studio - * @Support <http://www.almsaeedstudio.com> - * @Email <abdullah@almsaeedstudio.com> - * @version 2.3.7 - * @license MIT <http://opensource.org/licenses/MIT> - */ -function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&window.console&&window.console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slimScroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(document).on("click",a,function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").hasClass("sidebar-collapse")?$("body").removeClass("sidebar-collapse").trigger("expanded.pushMenu"):$("body").addClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").hasClass("sidebar-open")?$("body").removeClass("sidebar-open").removeClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").addClass("sidebar-open").trigger("expanded.pushMenu")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this,c=$.AdminLTE.options.animationSpeed;$(document).off("click",a+" li a").on("click",a+" li a",function(a){var d=$(this),e=d.next();if(e.is(".treeview-menu")&&e.is(":visible")&&!$("body").hasClass("sidebar-collapse"))e.slideUp(c,function(){e.removeClass("menu-open")}),e.parent("li").removeClass("active");else if(e.is(".treeview-menu")&&!e.is(":visible")){var f=d.parents("ul").first(),g=f.find("ul:visible").slideUp(c);g.removeClass("menu-open");var h=d.parent("li");e.slideDown(c,function(){e.addClass("menu-open"),f.find("li.active").removeClass("active"),h.addClass("active"),b.layout.fix()})}e.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height()<c.height()&&a._fixForContent(c)},open:function(a,b){b?a.addClass("control-sidebar-open"):$("body").addClass("control-sidebar-open")},close:function(a,b){b?a.removeClass("control-sidebar-open"):$("body").removeClass("control-sidebar-open")},_fix:function(a){var b=this;if($("body").hasClass("layout-boxed")){if(a.css("position","absolute"),a.height($(".wrapper").height()),b.hasBindedResize)return;$(window).resize(function(){b._fix(a)}),b.hasBindedResize=!0}else a.css({position:"fixed",height:"auto"})},_fixForFixed:function(a){a.css({position:"fixed","max-height":"100%",overflow:"auto","padding-bottom":"50px"})},_fixForContent:function(a){$(".content-wrapper, .right-side").css("min-height",a.height())}},$.AdminLTE.boxWidget={selectors:$.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,icons:$.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,animationSpeed:$.AdminLTE.options.animationSpeed,activate:function(a){var b=this;a||(a=document),$(a).on("click",b.selectors.collapse,function(a){a.preventDefault(),b.collapse($(this))}),$(a).on("click",b.selectors.remove,function(a){a.preventDefault(),b.remove($(this))})},collapse:function(a){var b=this,c=a.parents(".box").first(),d=c.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(b.animationSpeed,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(b.animationSpeed,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp(this.animationSpeed)}}}if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",animationSpeed:500,sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!1,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F012BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"use strict";$("body").removeClass("hold-transition"),"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(document).on("click",a.directChat.contactToggleSelector,function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-open")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){"use strict";a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){return a},onLoadDone:function(a){return a}},b),f=a('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');return this.each(function(){if(""===e.source)return void(window.console&&window.console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){"use strict";a.fn.activateBox=function(){a.AdminLTE.boxWidget.activate(this)},a.fn.toggleBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.collapse,this);a.AdminLTE.boxWidget.collapse(b)},a.fn.removeBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.remove,this);a.AdminLTE.boxWidget.remove(b)}}(jQuery),function(a){"use strict";a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){return a},onUncheck:function(a){return a}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input",this).on("ifChecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onCheck.call(b)}),a("input",this).on("ifUnchecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onUncheck.call(b)})):a("input",this).on("change",function(){var b=a(this).parents("li").first();b.toggleClass("done"),a("input",b).is(":checked")?c.onCheck.call(b):c.onUncheck.call(b)})})}}(jQuery); \ No newline at end of file diff --git a/public/admin/static/js/demo.js b/public/admin/static/js/demo.js deleted file mode 100644 index b18b9bb..0000000 --- a/public/admin/static/js/demo.js +++ /dev/null @@ -1,340 +0,0 @@ -/** - * AdminLTE Demo Menu - * ------------------ - * You should not use this file in production. - * This file is for demo purposes only. - */ -(function ($, AdminLTE) { - - "use strict"; - - /** - * List of all the available skins - * - * @type Array - */ - var my_skins = [ - "skin-blue", - "skin-black", - "skin-red", - "skin-yellow", - "skin-purple", - "skin-green", - "skin-blue-light", - "skin-black-light", - "skin-red-light", - "skin-yellow-light", - "skin-purple-light", - "skin-green-light" - ]; - - //Create the new tab - var tab_pane = $("<div />", { - "id": "control-sidebar-theme-demo-options-tab", - "class": "tab-pane active" - }); - - //Create the tab button - var tab_button = $("<li />", {"class": "active"}) - .html("<a href='#control-sidebar-theme-demo-options-tab' data-toggle='tab'>" - + "<i class='fa fa-wrench'></i>" - + "</a>"); - - //Add the tab button to the right sidebar tabs - $("[href='#control-sidebar-home-tab']") - .parent() - .before(tab_button); - - //Create the menu - var demo_settings = $("<div />"); - - //Layout options - demo_settings.append( - "<h4 class='control-sidebar-heading'>" - + "Layout Options" - + "</h4>" - //Fixed layout - + "<div class='form-group'>" - + "<label class='control-sidebar-subheading'>" - + "<input type='checkbox' data-layout='fixed' class='pull-right'/> " - + "Fixed layout" - + "</label>" - + "<p>Activate the fixed layout. You can't use fixed and boxed layouts together</p>" - + "</div>" - //Boxed layout - + "<div class='form-group'>" - + "<label class='control-sidebar-subheading'>" - + "<input type='checkbox' data-layout='layout-boxed'class='pull-right'/> " - + "Boxed Layout" - + "</label>" - + "<p>Activate the boxed layout</p>" - + "</div>" - //Sidebar Toggle - + "<div class='form-group'>" - + "<label class='control-sidebar-subheading'>" - + "<input type='checkbox' data-layout='sidebar-collapse' class='pull-right'/> " - + "Toggle Sidebar" - + "</label>" - + "<p>Toggle the left sidebar's state (open or collapse)</p>" - + "</div>" - //Sidebar mini expand on hover toggle - + "<div class='form-group'>" - + "<label class='control-sidebar-subheading'>" - + "<input type='checkbox' data-enable='expandOnHover' class='pull-right'/> " - + "Sidebar Expand on Hover" - + "</label>" - + "<p>Let the sidebar mini expand on hover</p>" - + "</div>" - //Control Sidebar Toggle - + "<div class='form-group'>" - + "<label class='control-sidebar-subheading'>" - + "<input type='checkbox' data-controlsidebar='control-sidebar-open' class='pull-right'/> " - + "Toggle Right Sidebar Slide" - + "</label>" - + "<p>Toggle between slide over content and push content effects</p>" - + "</div>" - //Control Sidebar Skin Toggle - + "<div class='form-group'>" - + "<label class='control-sidebar-subheading'>" - + "<input type='checkbox' data-sidebarskin='toggle' class='pull-right'/> " - + "Toggle Right Sidebar Skin" - + "</label>" - + "<p>Toggle between dark and light skins for the right sidebar</p>" - + "</div>" - ); - var skins_list = $("<ul />", {"class": 'list-unstyled clearfix'}); - - //Dark sidebar skins - var skin_blue = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-blue' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px; background: #367fa9;'></span><span class='bg-light-blue' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin'>Blue</p>"); - skins_list.append(skin_blue); - var skin_black = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-black' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div style='box-shadow: 0 0 2px rgba(0,0,0,0.1)' class='clearfix'><span style='display:block; width: 20%; float: left; height: 7px; background: #fefefe;'></span><span style='display:block; width: 80%; float: left; height: 7px; background: #fefefe;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin'>Black</p>"); - skins_list.append(skin_black); - var skin_purple = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-purple' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-purple-active'></span><span class='bg-purple' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin'>Purple</p>"); - skins_list.append(skin_purple); - var skin_green = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-green' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-green-active'></span><span class='bg-green' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin'>Green</p>"); - skins_list.append(skin_green); - var skin_red = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-red' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-red-active'></span><span class='bg-red' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin'>Red</p>"); - skins_list.append(skin_red); - var skin_yellow = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-yellow' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-yellow-active'></span><span class='bg-yellow' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin'>Yellow</p>"); - skins_list.append(skin_yellow); - - //Light sidebar skins - var skin_blue_light = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-blue-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px; background: #367fa9;'></span><span class='bg-light-blue' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin' style='font-size: 12px'>Blue Light</p>"); - skins_list.append(skin_blue_light); - var skin_black_light = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-black-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div style='box-shadow: 0 0 2px rgba(0,0,0,0.1)' class='clearfix'><span style='display:block; width: 20%; float: left; height: 7px; background: #fefefe;'></span><span style='display:block; width: 80%; float: left; height: 7px; background: #fefefe;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin' style='font-size: 12px'>Black Light</p>"); - skins_list.append(skin_black_light); - var skin_purple_light = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-purple-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-purple-active'></span><span class='bg-purple' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin' style='font-size: 12px'>Purple Light</p>"); - skins_list.append(skin_purple_light); - var skin_green_light = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-green-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-green-active'></span><span class='bg-green' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin' style='font-size: 12px'>Green Light</p>"); - skins_list.append(skin_green_light); - var skin_red_light = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-red-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-red-active'></span><span class='bg-red' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin' style='font-size: 12px'>Red Light</p>"); - skins_list.append(skin_red_light); - var skin_yellow_light = - $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) - .append("<a href='javascript:void(0);' data-skin='skin-yellow-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" - + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-yellow-active'></span><span class='bg-yellow' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" - + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" - + "</a>" - + "<p class='text-center no-margin' style='font-size: 12px;'>Yellow Light</p>"); - skins_list.append(skin_yellow_light); - - demo_settings.append("<h4 class='control-sidebar-heading'>Skins</h4>"); - demo_settings.append(skins_list); - - tab_pane.append(demo_settings); - $("#control-sidebar-home-tab").after(tab_pane); - - setup(); - - /** - * Toggles layout classes - * - * @param String cls the layout class to toggle - * @returns void - */ - function change_layout(cls) { - $("body").toggleClass(cls); - AdminLTE.layout.fixSidebar(); - //Fix the problem with right sidebar and layout boxed - if (cls == "layout-boxed") - AdminLTE.controlSidebar._fix($(".control-sidebar-bg")); - if ($('body').hasClass('fixed') && cls == 'fixed') { - AdminLTE.pushMenu.expandOnHover(); - AdminLTE.layout.activate(); - } - AdminLTE.controlSidebar._fix($(".control-sidebar-bg")); - AdminLTE.controlSidebar._fix($(".control-sidebar")); - } - - /** - * Replaces the old skin with the new skin - * @param String cls the new skin class - * @returns Boolean false to prevent link's default action - */ - function change_skin(cls) { - $.each(my_skins, function (i) { - $("body").removeClass(my_skins[i]); - }); - - $("body").addClass(cls); - store('skin', cls); - return false; - } - - /** - * Store a new settings in the browser - * - * @param String name Name of the setting - * @param String val Value of the setting - * @returns void - */ - function store(name, val) { - if (typeof (Storage) !== "undefined") { - localStorage.setItem(name, val); - } else { - window.alert('Please use a modern browser to properly view this template!'); - } - } - - /** - * Get a prestored setting - * - * @param String name Name of of the setting - * @returns String The value of the setting | null - */ - function get(name) { - if (typeof (Storage) !== "undefined") { - return localStorage.getItem(name); - } else { - window.alert('Please use a modern browser to properly view this template!'); - } - } - - /** - * Retrieve default settings and apply them to the template - * - * @returns void - */ - function setup() { - var tmp = get('skin'); - if (tmp && $.inArray(tmp, my_skins)) - change_skin(tmp); - - //Add the change skin listener - $("[data-skin]").on('click', function (e) { - if($(this).hasClass('knob')) - return; - e.preventDefault(); - change_skin($(this).data('skin')); - }); - - //Add the layout manager - $("[data-layout]").on('click', function () { - change_layout($(this).data('layout')); - }); - - $("[data-controlsidebar]").on('click', function () { - change_layout($(this).data('controlsidebar')); - var slide = !AdminLTE.options.controlSidebarOptions.slide; - AdminLTE.options.controlSidebarOptions.slide = slide; - if (!slide) - $('.control-sidebar').removeClass('control-sidebar-open'); - }); - - $("[data-sidebarskin='toggle']").on('click', function () { - var sidebar = $(".control-sidebar"); - if (sidebar.hasClass("control-sidebar-dark")) { - sidebar.removeClass("control-sidebar-dark") - sidebar.addClass("control-sidebar-light") - } else { - sidebar.removeClass("control-sidebar-light") - sidebar.addClass("control-sidebar-dark") - } - }); - - $("[data-enable='expandOnHover']").on('click', function () { - $(this).attr('disabled', true); - AdminLTE.pushMenu.expandOnHover(); - if (!$('body').hasClass('sidebar-collapse')) - $("[data-layout='sidebar-collapse']").click(); - }); - - // Reset options - if ($('body').hasClass('fixed')) { - $("[data-layout='fixed']").attr('checked', 'checked'); - } - if ($('body').hasClass('layout-boxed')) { - $("[data-layout='layout-boxed']").attr('checked', 'checked'); - } - if ($('body').hasClass('sidebar-collapse')) { - $("[data-layout='sidebar-collapse']").attr('checked', 'checked'); - } - - } -})(jQuery, $.AdminLTE); diff --git a/public/admin/static/js/pages/dashboard.js b/public/admin/static/js/pages/dashboard.js deleted file mode 100644 index 0f7c007..0000000 --- a/public/admin/static/js/pages/dashboard.js +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Author: Abdullah A Almsaeed - * Date: 4 Jan 2014 - * Description: - * This is a demo file used only for the main dashboard (index.html) - **/ - -$(function () { - - "use strict"; - - //Make the dashboard widgets sortable Using jquery UI - $(".connectedSortable").sortable({ - placeholder: "sort-highlight", - connectWith: ".connectedSortable", - handle: ".box-header, .nav-tabs", - forcePlaceholderSize: true, - zIndex: 999999 - }); - $(".connectedSortable .box-header, .connectedSortable .nav-tabs-custom").css("cursor", "move"); - - //jQuery UI sortable for the todo list - $(".todo-list").sortable({ - placeholder: "sort-highlight", - handle: ".handle", - forcePlaceholderSize: true, - zIndex: 999999 - }); - - //bootstrap WYSIHTML5 - text editor - $(".textarea").wysihtml5(); - - $('.daterange').daterangepicker({ - ranges: { - 'Today': [moment(), moment()], - 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], - 'Last 7 Days': [moment().subtract(6, 'days'), moment()], - 'Last 30 Days': [moment().subtract(29, 'days'), moment()], - 'This Month': [moment().startOf('month'), moment().endOf('month')], - 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] - }, - startDate: moment().subtract(29, 'days'), - endDate: moment() - }, function (start, end) { - window.alert("You chose: " + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); - }); - - /* jQueryKnob */ - $(".knob").knob(); - - //jvectormap data - var visitorsData = { - "US": 398, //USA - "SA": 400, //Saudi Arabia - "CA": 1000, //Canada - "DE": 500, //Germany - "FR": 760, //France - "CN": 300, //China - "AU": 700, //Australia - "BR": 600, //Brazil - "IN": 800, //India - "GB": 320, //Great Britain - "RU": 3000 //Russia - }; - //World map by jvectormap - $('#world-map').vectorMap({ - map: 'world_mill_en', - backgroundColor: "transparent", - regionStyle: { - initial: { - fill: '#e4e4e4', - "fill-opacity": 1, - stroke: 'none', - "stroke-width": 0, - "stroke-opacity": 1 - } - }, - series: { - regions: [{ - values: visitorsData, - scale: ["#92c1dc", "#ebf4f9"], - normalizeFunction: 'polynomial' - }] - }, - onRegionLabelShow: function (e, el, code) { - if (typeof visitorsData[code] != "undefined") - el.html(el.html() + ': ' + visitorsData[code] + ' new visitors'); - } - }); - - //Sparkline charts - var myvalues = [1000, 1200, 920, 927, 931, 1027, 819, 930, 1021]; - $('#sparkline-1').sparkline(myvalues, { - type: 'line', - lineColor: '#92c1dc', - fillColor: "#ebf4f9", - height: '50', - width: '80' - }); - myvalues = [515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921]; - $('#sparkline-2').sparkline(myvalues, { - type: 'line', - lineColor: '#92c1dc', - fillColor: "#ebf4f9", - height: '50', - width: '80' - }); - myvalues = [15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21]; - $('#sparkline-3').sparkline(myvalues, { - type: 'line', - lineColor: '#92c1dc', - fillColor: "#ebf4f9", - height: '50', - width: '80' - }); - - //The Calender - $("#calendar").datepicker(); - - //SLIMSCROLL FOR CHAT WIDGET - $('#chat-box').slimScroll({ - height: '250px' - }); - - /* Morris.js Charts */ - // Sales chart - var area = new Morris.Area({ - element: 'revenue-chart', - resize: true, - data: [ - {y: '2011 Q1', item1: 2666, item2: 2666}, - {y: '2011 Q2', item1: 2778, item2: 2294}, - {y: '2011 Q3', item1: 4912, item2: 1969}, - {y: '2011 Q4', item1: 3767, item2: 3597}, - {y: '2012 Q1', item1: 6810, item2: 1914}, - {y: '2012 Q2', item1: 5670, item2: 4293}, - {y: '2012 Q3', item1: 4820, item2: 3795}, - {y: '2012 Q4', item1: 15073, item2: 5967}, - {y: '2013 Q1', item1: 10687, item2: 4460}, - {y: '2013 Q2', item1: 8432, item2: 5713} - ], - xkey: 'y', - ykeys: ['item1', 'item2'], - labels: ['Item 1', 'Item 2'], - lineColors: ['#a0d0e0', '#3c8dbc'], - hideHover: 'auto' - }); - var line = new Morris.Line({ - element: 'line-chart', - resize: true, - data: [ - {y: '2011 Q1', item1: 2666}, - {y: '2011 Q2', item1: 2778}, - {y: '2011 Q3', item1: 4912}, - {y: '2011 Q4', item1: 3767}, - {y: '2012 Q1', item1: 6810}, - {y: '2012 Q2', item1: 5670}, - {y: '2012 Q3', item1: 4820}, - {y: '2012 Q4', item1: 15073}, - {y: '2013 Q1', item1: 10687}, - {y: '2013 Q2', item1: 8432} - ], - xkey: 'y', - ykeys: ['item1'], - labels: ['Item 1'], - lineColors: ['#efefef'], - lineWidth: 2, - hideHover: 'auto', - gridTextColor: "#fff", - gridStrokeWidth: 0.4, - pointSize: 4, - pointStrokeColors: ["#efefef"], - gridLineColor: "#efefef", - gridTextFamily: "Open Sans", - gridTextSize: 10 - }); - - //Donut Chart - var donut = new Morris.Donut({ - element: 'sales-chart', - resize: true, - colors: ["#3c8dbc", "#f56954", "#00a65a"], - data: [ - {label: "Download Sales", value: 12}, - {label: "In-Store Sales", value: 30}, - {label: "Mail-Order Sales", value: 20} - ], - hideHover: 'auto' - }); - - //Fix for charts under tabs - $('.box ul.nav a').on('shown.bs.tab', function () { - area.redraw(); - donut.redraw(); - line.redraw(); - }); - - /* The todo list plugin */ - $(".todo-list").todolist({ - onCheck: function (ele) { - window.console.log("The element has been checked"); - return ele; - }, - onUncheck: function (ele) { - window.console.log("The element has been unchecked"); - return ele; - } - }); - -}); diff --git a/public/admin/static/js/pages/dashboard2.js b/public/admin/static/js/pages/dashboard2.js deleted file mode 100644 index cc67785..0000000 --- a/public/admin/static/js/pages/dashboard2.js +++ /dev/null @@ -1,274 +0,0 @@ -$(function () { - - 'use strict'; - - /* ChartJS - * ------- - * Here we will create a few charts using ChartJS - */ - - //----------------------- - //- MONTHLY SALES CHART - - //----------------------- - - // Get context with jQuery - using jQuery's .get() method. - var salesChartCanvas = $("#salesChart").get(0).getContext("2d"); - // This will get the first returned node in the jQuery collection. - var salesChart = new Chart(salesChartCanvas); - - var salesChartData = { - labels: ["January", "February", "March", "April", "May", "June", "July"], - datasets: [ - { - label: "Electronics", - fillColor: "rgb(210, 214, 222)", - strokeColor: "rgb(210, 214, 222)", - pointColor: "rgb(210, 214, 222)", - pointStrokeColor: "#c1c7d1", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgb(220,220,220)", - data: [65, 59, 80, 81, 56, 55, 40] - }, - { - label: "Digital Goods", - fillColor: "rgba(60,141,188,0.9)", - strokeColor: "rgba(60,141,188,0.8)", - pointColor: "#3b8bba", - pointStrokeColor: "rgba(60,141,188,1)", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(60,141,188,1)", - data: [28, 48, 40, 19, 86, 27, 90] - } - ] - }; - - var salesChartOptions = { - //Boolean - If we should show the scale at all - showScale: true, - //Boolean - Whether grid lines are shown across the chart - scaleShowGridLines: false, - //String - Colour of the grid lines - scaleGridLineColor: "rgba(0,0,0,.05)", - //Number - Width of the grid lines - scaleGridLineWidth: 1, - //Boolean - Whether to show horizontal lines (except X axis) - scaleShowHorizontalLines: true, - //Boolean - Whether to show vertical lines (except Y axis) - scaleShowVerticalLines: true, - //Boolean - Whether the line is curved between points - bezierCurve: true, - //Number - Tension of the bezier curve between points - bezierCurveTension: 0.3, - //Boolean - Whether to show a dot for each point - pointDot: false, - //Number - Radius of each point dot in pixels - pointDotRadius: 4, - //Number - Pixel width of point dot stroke - pointDotStrokeWidth: 1, - //Number - amount extra to add to the radius to cater for hit detection outside the drawn point - pointHitDetectionRadius: 20, - //Boolean - Whether to show a stroke for datasets - datasetStroke: true, - //Number - Pixel width of dataset stroke - datasetStrokeWidth: 2, - //Boolean - Whether to fill the dataset with a color - datasetFill: true, - //String - A legend template - legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%=datasets[i].label%></li><%}%></ul>", - //Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container - maintainAspectRatio: true, - //Boolean - whether to make the chart responsive to window resizing - responsive: true - }; - - //Create the line chart - salesChart.Line(salesChartData, salesChartOptions); - - //--------------------------- - //- END MONTHLY SALES CHART - - //--------------------------- - - //------------- - //- PIE CHART - - //------------- - // Get context with jQuery - using jQuery's .get() method. - var pieChartCanvas = $("#pieChart").get(0).getContext("2d"); - var pieChart = new Chart(pieChartCanvas); - var PieData = [ - { - value: 700, - color: "#f56954", - highlight: "#f56954", - label: "Chrome" - }, - { - value: 500, - color: "#00a65a", - highlight: "#00a65a", - label: "IE" - }, - { - value: 400, - color: "#f39c12", - highlight: "#f39c12", - label: "FireFox" - }, - { - value: 600, - color: "#00c0ef", - highlight: "#00c0ef", - label: "Safari" - }, - { - value: 300, - color: "#3c8dbc", - highlight: "#3c8dbc", - label: "Opera" - }, - { - value: 100, - color: "#d2d6de", - highlight: "#d2d6de", - label: "Navigator" - } - ]; - var pieOptions = { - //Boolean - Whether we should show a stroke on each segment - segmentShowStroke: true, - //String - The colour of each segment stroke - segmentStrokeColor: "#fff", - //Number - The width of each segment stroke - segmentStrokeWidth: 1, - //Number - The percentage of the chart that we cut out of the middle - percentageInnerCutout: 50, // This is 0 for Pie charts - //Number - Amount of animation steps - animationSteps: 100, - //String - Animation easing effect - animationEasing: "easeOutBounce", - //Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - //Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false, - //Boolean - whether to make the chart responsive to window resizing - responsive: true, - // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container - maintainAspectRatio: false, - //String - A legend template - legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>", - //String - A tooltip template - tooltipTemplate: "<%=value %> <%=label%> users" - }; - //Create pie or douhnut chart - // You can switch between pie and douhnut using the method below. - pieChart.Doughnut(PieData, pieOptions); - //----------------- - //- END PIE CHART - - //----------------- - - /* jVector Maps - * ------------ - * Create a world map with markers - */ - $('#world-map-markers').vectorMap({ - map: 'world_mill_en', - normalizeFunction: 'polynomial', - hoverOpacity: 0.7, - hoverColor: false, - backgroundColor: 'transparent', - regionStyle: { - initial: { - fill: 'rgba(210, 214, 222, 1)', - "fill-opacity": 1, - stroke: 'none', - "stroke-width": 0, - "stroke-opacity": 1 - }, - hover: { - "fill-opacity": 0.7, - cursor: 'pointer' - }, - selected: { - fill: 'yellow' - }, - selectedHover: {} - }, - markerStyle: { - initial: { - fill: '#00a65a', - stroke: '#111' - } - }, - markers: [ - {latLng: [41.90, 12.45], name: 'Vatican City'}, - {latLng: [43.73, 7.41], name: 'Monaco'}, - {latLng: [-0.52, 166.93], name: 'Nauru'}, - {latLng: [-8.51, 179.21], name: 'Tuvalu'}, - {latLng: [43.93, 12.46], name: 'San Marino'}, - {latLng: [47.14, 9.52], name: 'Liechtenstein'}, - {latLng: [7.11, 171.06], name: 'Marshall Islands'}, - {latLng: [17.3, -62.73], name: 'Saint Kitts and Nevis'}, - {latLng: [3.2, 73.22], name: 'Maldives'}, - {latLng: [35.88, 14.5], name: 'Malta'}, - {latLng: [12.05, -61.75], name: 'Grenada'}, - {latLng: [13.16, -61.23], name: 'Saint Vincent and the Grenadines'}, - {latLng: [13.16, -59.55], name: 'Barbados'}, - {latLng: [17.11, -61.85], name: 'Antigua and Barbuda'}, - {latLng: [-4.61, 55.45], name: 'Seychelles'}, - {latLng: [7.35, 134.46], name: 'Palau'}, - {latLng: [42.5, 1.51], name: 'Andorra'}, - {latLng: [14.01, -60.98], name: 'Saint Lucia'}, - {latLng: [6.91, 158.18], name: 'Federated States of Micronesia'}, - {latLng: [1.3, 103.8], name: 'Singapore'}, - {latLng: [1.46, 173.03], name: 'Kiribati'}, - {latLng: [-21.13, -175.2], name: 'Tonga'}, - {latLng: [15.3, -61.38], name: 'Dominica'}, - {latLng: [-20.2, 57.5], name: 'Mauritius'}, - {latLng: [26.02, 50.55], name: 'Bahrain'}, - {latLng: [0.33, 6.73], name: 'São Tomé and Príncipe'} - ] - }); - - /* SPARKLINE CHARTS - * ---------------- - * Create a inline charts with spark line - */ - - //----------------- - //- SPARKLINE BAR - - //----------------- - $('.sparkbar').each(function () { - var $this = $(this); - $this.sparkline('html', { - type: 'bar', - height: $this.data('height') ? $this.data('height') : '30', - barColor: $this.data('color') - }); - }); - - //----------------- - //- SPARKLINE PIE - - //----------------- - $('.sparkpie').each(function () { - var $this = $(this); - $this.sparkline('html', { - type: 'pie', - height: $this.data('height') ? $this.data('height') : '90', - sliceColors: $this.data('color') - }); - }); - - //------------------ - //- SPARKLINE LINE - - //------------------ - $('.sparkline').each(function () { - var $this = $(this); - $this.sparkline('html', { - type: 'line', - height: $this.data('height') ? $this.data('height') : '90', - width: '100%', - lineColor: $this.data('linecolor'), - fillColor: $this.data('fillcolor'), - spotColor: $this.data('spotcolor') - }); - }); -}); diff --git a/public/admin/static/js/template.js b/public/admin/static/js/template.js deleted file mode 100644 index f4b8fd8..0000000 --- a/public/admin/static/js/template.js +++ /dev/null @@ -1,355 +0,0 @@ -/** - * 模版引擎 - * ------------------ - * You should not use this file in production. - * This file is for demo purposes only. - */ - -(function ($) { - "use strict"; - var bodyDom = $('body'); - /** - * 格式化时间戳(为了和PHP的date函数统一,这里的时间戳都是10位,不包含毫秒) - * @param timestamp - * @returns {string} - */ - $.formatDate = function ( timestamp ) { - timestamp *= 1000; - var date = new Date(timestamp); - var Y = date.getFullYear() + '-'; - var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-'; - var D = (date.getDate()+1 < 10 ? '0'+(date.getDate()+1) : date.getDate()+1) + ' '; - var h = (date.getHours() < 10 ? '0'+date.getHours() : date.getHours()) + ':'; - var m = (date.getMinutes() < 10 ? '0'+date.getMinutes() : date.getMinutes()) + ':'; - var s = date.getSeconds() < 10 ? '0'+date.getSeconds() : date.getSeconds(); - return Y+M+D+h+m+s; - }; - - /** - * 消息弹框 - * @param msg - * @param wait 等待时间(毫秒) - */ - $.alertMsg = function( msg, wait ){ - wait = wait ? wait : 2800; - var dialog = bootbox.dialog({ - message: '<p class="text-center">'+msg+'</p>', - closeButton: false - }); - setTimeout(function(){ - dialog.modal('hide'); - }, wait); - }; - - /** - * 刷新数据,允许带参数刷新 - * @param url - * @param urlData - */ - $.refresh = function ( url, urlData ) { - urlData = urlData ? urlData : ''; - var loadingBox = bootbox.dialog({ - message: '<div class="text-center"><i class="fa fa-spin fa-spinner"></i> Loading...</div>', - closeButton: false - }); - $.ajax({ - type: "GET", - url: url, - data: urlData, - success: function(data){ - loadingBox.modal('hide'); - if( data.code == 200 ){ - if( data.data.tempType == 'table' ){ - if( $.buildTable ){ - $('#content').html($.buildTable(data.data)); - $('#tableBox').hide().fadeIn(800); - }else{ - $.getScript(JS_PATH + '/template/table.js', function (){ - $('#content').html($.buildTable(data.data)); - $('#tableBox').hide().fadeIn(800); - }); - } - } - if( data.data.tempType == 'add' ){ - if( $.buildAddForm ){ - $('#content').html($.buildAddForm(data.data)); - $('#formBox').hide().fadeIn(800); - }else{ - $.getScript(JS_PATH + '/template/form.js', function (){ - $('#content').html($.buildAddForm(data.data)); - $('#formBox').hide().fadeIn(800); - }); - } - } - if( data.data.tempType == 'edit' ){ - if( $.buildEditForm ){ - $('#content').html($.buildEditForm(data.data)); - $('#formBox').hide().fadeIn(800); - }else{ - $.getScript(JS_PATH + '/template/form.js', function (){ - $('#content').html($.buildEditForm(data.data)); - $('#formBox').hide().fadeIn(800); - }); - } - } - }else{ - $.alertMsg(data.msg); - setTimeout(function() { - if (data.url) { - if( data.data == 302 ){ - location.href = data.url; - }else{ - $.refresh(data.url); - } - } - }, 1000*data.wait); - } - }, - statusCode: { - 404: function() { - loadingBox.modal('hide'); - $.alertMsg('页面未找到'); - }, - 500: function () { - loadingBox.modal('hide'); - $.alertMsg('服务器内部错误,请联系管理员!'); - } - } - }); - }; - - /** - * Ajax Post 表单提交(增) * - */ - bodyDom.on('click', '.ajax-post', function() { - var message,query,form,target; - var target_form = $(this).attr('target-form'); - var isRedirect = $(this).hasClass('redirect'); - form = $('#' + target_form); - query = form.serialize(); - target = form.attr('action'); - $.post(target, query).success(function(data) { - var wait = 1000*data.wait; - if (data.code == 1) { - if (data.url) { - message = data.msg + ' 页面即将自动跳转...'; - } else { - message = data.msg; - } - $.alertMsg(message, wait); - if( isRedirect ){ - setTimeout(function() { - if (data.url) { - location.href = data.url; - } else { - location.reload(); - } - }, wait); - }else{ - setTimeout(function() { - if (data.url) { - $.refresh(data.url); - } - }, wait); - } - } else { - $.alertMsg(data.msg, wait); - } - }); - return false; - }); - - /** - * Ajax Put 表单提交(改) * - */ - bodyDom.on('click', '.ajax-put', function() { - var message,query,form,target; - var target_form = $(this).attr('target-form'); - form = $('#' + target_form); - query = form.serialize(); - target = form.attr('action'); - $.ajax({ - type: "PUT", - url: target, - data: query, - statusCode: { - 404: function() { - $.alertMsg('页面未找到'); - }, - 500: function () { - $.alertMsg('服务器内部错误,请联系管理员!'); - } - } - }).done(function( data ) { - var wait = 1000*data.wait; - if (data.code == 1) { - if (data.url) { - message = data.msg + ' 页面即将自动跳转...'; - } else { - message = data.msg; - } - $.alertMsg(message, wait); - setTimeout(function() { - if (data.url) { - $.refresh(data.url); - } - }, wait); - } else { - $.alertMsg(data.msg, wait); - } - }); - return false; - }); - - /** - * Ajax Delete 请求(删) * - */ - bodyDom.on('click', '.ajax-delete', function() { - var url = $(this).attr('url'), urlData = ''; - if( $(this).attr('data') ){ - urlData = $(this).attr('data'); - } - if( $(this).hasClass('confirm') ){ - bootbox.confirm({ - title: "温馨提醒:", - message: "您确定要这么做么?", - buttons: { - cancel: { - label: '<i class="fa fa-times"></i> 取消' - }, - confirm: { - label: '<i class="fa fa-check"></i> 确定' - } - }, - callback: function (result) { - if( result ){ - $.ajax({ - type: "DELETE", - url: url, - data: urlData, - statusCode: { - 404: function () { - $.alertMsg('页面未找到'); - }, - 500: function () { - $.alertMsg('服务器内部错误,请联系管理员!'); - } - } - }).done(function( data ) { - var wait = 1000*data.wait; - if (data.code == 1) { - $.alertMsg(data.msg, wait); - setTimeout(function() { - if (data.url) { - $.refresh(data.url); - } - }, wait); - } else { - $.alertMsg(data.msg, wait); - } - }); - } - } - }); - } - return false; - }); - - /** - * Ajax put by url 请求(改) * - */ - bodyDom.on('click', '.ajax-put-url', function() { - var url = $(this).attr('url'), urlData = ''; - if( $(this).attr('data') ){ - urlData = $(this).attr('data'); - } - if( $(this).hasClass('confirm') ){ - bootbox.confirm({ - title: "温馨提醒:", - message: "您确定要这么做么?", - buttons: { - cancel: { - label: '<i class="fa fa-times"></i> 取消' - }, - confirm: { - label: '<i class="fa fa-check"></i> 确定' - } - }, - callback: function (result) { - if( result ){ - $.ajax({ - type: "PUT", - url: url, - data: urlData, - statusCode: { - 404: function () { - $.alertMsg('页面未找到'); - }, - 500: function () { - $.alertMsg('服务器内部错误,请联系管理员!'); - } - } - }).done(function( data ) { - var wait = 1000*data.wait; - if (data.code == 1) { - $.alertMsg(data.msg, wait); - setTimeout(function() { - if (data.url) { - $.refresh(data.url); - } - }, wait); - } else { - $.alertMsg(data.msg, wait); - } - }); - } - } - }); - } - return false; - }); - - /** - * Ajax 刷新页面 * - */ - bodyDom.on('click', '.refresh', function() { - var url = $(this).attr('url'), urlData = ''; - if( $(this).attr('data') ){ - urlData = $(this).attr('data'); - } - $.refresh(url, urlData); - }); - - /** - * 转为权限修改定制的Ajax请求 - */ - bodyDom.on('click', '.auth', function () { - var tdDom = $(this).parent().parent().children(); - var urlName = tdDom.eq(2).html(); - var url = $(this).attr('url'); - var message; - $.ajax({ - type: "PUT", - url: url, - data: {urlName:urlName, get:Number(tdDom.find('[name=get]').is(':checked')), post:Number(tdDom.find('[name=post]').is(':checked')), put:Number(tdDom.find('[name=put]').is(':checked')), delete:Number(tdDom.find('[name=delete]').is(':checked'))} - }).done(function( data ) { - var wait = 1000*data.wait; - if (data.code == 1) { - if (data.url) { - message = data.msg + ' 页面即将自动跳转...'; - } else { - message = data.msg; - } - $.alertMsg(message, wait); - setTimeout(function() { - if (data.url) { - $.refresh(data.url); - } - }, wait); - } else { - $.alertMsg(data.msg, wait); - } - }); - }) - -})(jQuery); diff --git a/public/admin/static/js/template/form.js b/public/admin/static/js/template/form.js deleted file mode 100644 index 8969cb5..0000000 --- a/public/admin/static/js/template/form.js +++ /dev/null @@ -1,235 +0,0 @@ -(function ($) { - /** - * 创建新增表单 - * @param formObj - * @returns {string} - */ - $.buildAddForm = function ( formObj ) { - return buildForm(formObj, 'box-success', 'ajax-post'); - }; - - /** - * 创建编辑表单 - * @param formObj - * @returns {string} - */ - $.buildEditForm = function ( formObj ) { - return buildForm(formObj, 'box-warning', 'ajax-put'); - }; - - /** - * 根据规则创建表单 - * @param formObj 表单数据对象 - * @param boxType box样式 - * @param method 数据提交方式 - * @returns {string} - */ - function buildForm( formObj, boxType, method ) { - var formHtml = '<div class="box '+ boxType +'" id="formBox"><div class="box-body">'; - formHtml += '<div class="box-header with-border"><h3 class="box-title">'+formObj.formTitle+'</h3></div>'; - formHtml += '<form id="'+ formObj.formAttr.formId +'" action="'+ formObj.formAttr.target +'"><div class="box-body">'; - $.each(formObj.formList, function (index, value) { - switch (value.module){ - case 'text': - formHtml += buildInput(value); - break; - case 'select': - formHtml += buildSelect(value); - break; - case 'radio': - formHtml += buildRadio(value); - break; - case 'hidden': - formHtml += buildHidden(value); - break; - case 'checkbox': - formHtml += buildCheckbox(value); - break; - case 'password': - formHtml += buildPassword(value); - break; - case 'textarea': - formHtml += buildTextarea(value); - break; - } - }); - formHtml += '</div><div class="box-footer">'; - formHtml += '<button type="submit" target-form="'+ formObj.formAttr.formId +'" class="btn btn-primary '+ method +'">确认提交</button>'; - formHtml += ' <a class="btn btn-default refresh" url="'+ formObj.formAttr.backUrl +'" >放弃返回</a></div></form></div></div>'; - return formHtml; - } - - /** - * 创建文本框 - * @param inputObj - * @returns {string} - */ - function buildPassword( inputObj ) { - var formHtml = '<div><div class="col-xs-8 form-group"><label>'+ inputObj.info +'</label>'; - var placeholder = '', value = ''; - if( inputObj.attr.placeholder){ - placeholder = 'placeholder="'+ inputObj.attr.placeholder +'"'; - } - if( inputObj.attr.value){ - value = 'value="'+ inputObj.attr.value +'"'; - } - formHtml += '<input type="password" class="form-control" '+ placeholder +' '+ value +' name="'+ inputObj.attr.name +'"></div>'; - if( inputObj.description && inputObj.description.length ){ - formHtml += ' <div class="col-xs-4 form-group" style="margin-top: 30px"><span class="label label-info">'+ inputObj.description +'</span></div>'; - } - formHtml += '</div>'; - return formHtml; - } - - /** - * 创建多选框 - * @param checkboxObj - * @returns {string} - */ - function buildCheckbox( checkboxObj ) { - var formHtml = '<div>'; - formHtml += '<div class="col-xs-8 form-group"><label>'+ checkboxObj.info +'</label>'; - formHtml += '<div class="input-group radio" style="margin-bottom: 0px">'; - if( checkboxObj.attr ){ - $.each(checkboxObj.attr, function (index, value) { - if( value.value ){ - formHtml += '<label style="padding-left: 0px;padding-right: 20px"><input type="checkbox" checked name="'+ value.name +'"> '+ value.desc +'</label>'; - }else{ - formHtml += '<label style="padding-left: 0px;padding-right: 20px"><input type="checkbox" name="'+ value.name +'"> '+ value.desc +'</label>'; - } - }); - } - formHtml += '</div>'; - if( checkboxObj.description ){ - formHtml += ' <div class="col-xs-4 form-group" style="margin-top: 30px"><span class="label label-info">'+ checkboxObj.description +'</span></div>'; - } - formHtml += '</div></div>'; - return formHtml; - } - - /** - * 创建文本框 - * @param inputObj - * @returns {string} - */ - function buildInput( inputObj ) { - var formHtml = '<div><div class="col-xs-8 form-group"><label>'+ inputObj.info +'</label>'; - var placeholder = '', value = '', disabled = '', readOnly = ''; - if( inputObj.attr.placeholder){ - placeholder = 'placeholder="'+ inputObj.attr.placeholder +'"'; - } - if( inputObj.attr.value){ - value = 'value="'+ inputObj.attr.value +'"'; - } - if( inputObj.attr.disabled ){ - disabled = 'disabled'; - } - if( inputObj.attr.readOnly ){ - readOnly = 'readOnly'; - } - formHtml += '<input type="text" class="form-control" '+ placeholder +' '+ disabled +' '+ readOnly +' '+ value +' name="'+ inputObj.attr.name +'"></div>'; - if( inputObj.description && inputObj.description.length ){ - formHtml += ' <div class="col-xs-4 form-group" style="margin-top: 30px"><span class="label label-info">'+ inputObj.description +'</span></div>'; - } - formHtml += '</div>'; - return formHtml; - } - - /** - * 创建单选框 - * @param radioObj - * @returns {string} - */ - function buildRadio( radioObj ) { - var formHtml = '<div>'; - formHtml += '<div class="col-xs-8 form-group"><label>'+ radioObj.info +'</label>'; - formHtml += '<div class="input-group radio">'; - if( radioObj.attr.options ){ - $.each(radioObj.attr.options, function (index, value) { - if( index == radioObj.attr.value ){ - formHtml += '<label><input type="radio" checked name="'+ radioObj.attr.name +'" value="'+ index +'"> '+ value +'</label> '; - }else{ - formHtml += '<label><input type="radio" name="'+ radioObj.attr.name +'" value="'+ index +'"> '+ value +'</label> '; - } - }); - } - formHtml += '</div>'; - if( radioObj.description ){ - formHtml += ' <div class="col-xs-4 form-group" style="margin-top: 30px"><span class="label label-info">'+ radioObj.description +'</span></div>'; - } - formHtml += '</div></div>'; - return formHtml; - } - - /** - * 创建隐藏表单 - * @param hiddenObj - * @returns {string} - */ - function buildHidden( hiddenObj ) { - return '<input type="hidden" class="form-control" value="'+ hiddenObj.attr.value +'" name="'+ hiddenObj.attr.name +'">'; - } - - /** - * 创建文本域 - * @param textareaObj - * @returns {string} - */ - function buildTextarea( textareaObj ) { - var formHtml = '<div><div class="col-xs-8 form-group"><label>'+ textareaObj.info +'</label>'; - var placeholder = '', value = ''; - if( textareaObj.attr.placeholder){ - placeholder = 'placeholder="'+ textareaObj.attr.placeholder +'"'; - } - if( textareaObj.attr.value){ - value = textareaObj.attr.value; - } - formHtml += '<textarea rows="5" class="form-control" '+ placeholder +' name="'+ textareaObj.attr.name +'">'+ value +'</textarea></div>'; - if( textareaObj.description && textareaObj.description.length ){ - formHtml += ' <div class="col-xs-4 form-group" style="margin-top: 30px"><span class="label label-info">'+ textareaObj.description +'</span></div>'; - } - formHtml += '</div>'; - return formHtml; - } - - /** - * 创建下拉菜单 - * @param selectObj - * @returns {string} - */ - function buildSelect( selectObj ) { - var formHtml = '<div>'; - formHtml += '<div class="col-xs-8 form-group"><label>'+ selectObj.info +'</label>'; - if( selectObj.attr.options ){ - formHtml += '<select class="form-control" name="'+ selectObj.attr.name +'">'; - formHtml += '<option>请选择</option>'; - $.each(selectObj.attr.options, function (index, value) { - if( index == selectObj.attr.value ){ - formHtml += '<option value="'+ index +'" selected>'+ value +'</option>'; - }else{ - formHtml += '<option value="'+ index +'">'+ value +'</option>'; - } - }); - }else{ - formHtml += '<select class="form-control" name="'+ selectObj.attr.name +'" disabled>'; - } - formHtml += '</select></div>'; - if( selectObj.description && selectObj.description.length ){ - formHtml += ' <div class="col-xs-4 form-group" style="margin-top: 30px"><span class="label label-info">'+ selectObj.description +'</span></div>'; - } - formHtml += '</div>'; - return formHtml; - } - - function buildEditors() { - - } - - function buildUpload() { - - } - - function buildCode() { - - } -})(jQuery); \ No newline at end of file diff --git a/public/admin/static/js/template/table.js b/public/admin/static/js/template/table.js deleted file mode 100644 index aa480ce..0000000 --- a/public/admin/static/js/template/table.js +++ /dev/null @@ -1,218 +0,0 @@ -(function ($) { - /** - * 创建表格HTML字符串 - * 1、严重依赖Bootstrap的样式 - * 2、严格的Json数据格式 - * 3、如果有右侧操作按钮的话会默认自动加入{field:"action",info:"操作"}所以字段名不支持使用action,action是关键字 - * @param tableObj - * @returns {string} - */ - $.buildTable = function ( tableObj ) { - var tableHtml = '<div class="box box-primary" id="tableBox"><div class="box-body">'; - if( tableObj.rightButton && tableObj.rightButton.length ){ - tableObj.header.push({field:"action",info:"操作"}); - } - if( tableObj.topButton && tableObj.topButton.length ){ - tableHtml += buildTopButton( tableObj ); - } - tableHtml += '<table class="table table-bordered"> <tbody>'; - if( tableObj.header && tableObj.header.length ){ - tableHtml += buildHeader( tableObj ); - } - if( tableObj.data && tableObj.data.length ){ - tableHtml += buildDataList( tableObj ); - }else{ - tableHtml += buildEmptyTable( tableObj ); - } - tableHtml += '</tbody></table></div></div>'; - return tableHtml; - }; - - /** - * 创建表格头部分 - * @param tableObj - * @returns {string} - */ - function buildHeader( tableObj ) { - var headerHtml = '<tr><th style="width: 10px"><input type="checkbox"></th>'; - $.each(tableObj.header, function (index, value) { - headerHtml += '<th>'+ value.info +'</th>'; - }); - headerHtml += '</tr>'; - return headerHtml; - } - - /** - * 创建顶部功能按钮 - * @param tableObj - * @returns {string} - */ - function buildTopButton( tableObj ) { - var topHtml = '<div class="btn-group margin-bottom">'; - if( tableObj.topButton ){ - $.each(tableObj.topButton, function(index, value) { - topHtml += createButton(value); - }); - } - topHtml += '</div>'; - return topHtml; - } - - /** - * 创建数据部分 - * @param tableObj - * @returns {string} - */ - function buildDataList( tableObj ) { - var paramStr, dataListHtml = ''; - $.each(tableObj.data, function (dataIndex, dataValue) { - dataListHtml += '<tr><td><input type="checkbox"></td>'; - $.each(tableObj.header, function (fieldIndex, fieldValue) { - var fieldName = fieldValue.field; - if( fieldName == 'action' ){ - dataListHtml += '<td><div class="btn-group">'; - $.each(tableObj.rightButton, function(buttonIndex, buttonValue) { - dataListHtml += createButton(buttonValue, dataValue); - }); - dataListHtml += '</div></td>'; - }else{ - if( tableObj.typeRule[fieldName] ){ - var rule = tableObj.typeRule[fieldName]; - var styleList ,detailInfo, classAttr = ''; - switch (rule.module){ - case 'label': - if( rule.rule[dataValue[fieldName]] ){ - styleList = rule.rule[dataValue[fieldName]]; - detailInfo = prepareInfo( styleList, dataValue, fieldName); - dataListHtml += '<td><span class="'+styleList['class']+'">'+detailInfo+'</span></td>'; - }else{ - dataListHtml += '<td style="color:red;">' + dataValue[fieldName] + '</td>'; - } - break; - case 'a': - styleList = rule.rule; - detailInfo = prepareInfo( styleList, dataValue, fieldName); - paramStr = prepareParamStr( styleList, dataValue ); - if( styleList['class'] ){ - classAttr = 'class="'+ styleList['class'] +'"'; - } - dataListHtml += '<td><a '+ classAttr +' url="'+styleList['href']+'" data="'+paramStr+'">' + detailInfo + '</a></td>'; - break; - case 'date': - dataListHtml += '<td>' + $.formatDate(dataValue[fieldName]) + '</td>'; - break; - case 'icon': - if( rule.rule[dataValue[fieldName]] ){ - styleList = rule.rule[dataValue[fieldName]]; - dataListHtml += '<td><i class="'+styleList['class']+'"></i></td>'; - }else{ - dataListHtml += '<td style="color:red;">' + dataValue[fieldName] + '</td>'; - } - break; - case 'auth': - if( dataValue['url'] ){ - if( dataValue[fieldName] && dataValue[fieldName] != 0 ){ - dataListHtml += '<td><input class="auth" checked type="checkbox" url="'+ rule.rule['url'] +'" name="'+fieldName+'" ></td>'; - }else{ - dataListHtml += '<td><input class="auth" type="checkbox" url="'+ rule.rule['url'] +'" name="'+fieldName+'" ></td>'; - } - } - break; - case 'listValue': - if( rule.rule[dataValue[fieldName]] ){ - styleList = rule.rule[dataValue[fieldName]]; - dataListHtml += '<td>'+ styleList +'</td>'; - }else{ - dataListHtml += '<td style="color:red;">' + dataValue[fieldName] + '</td>'; - } - break; - } - }else{ - dataListHtml += '<td>' + dataValue[fieldName] + '</td>'; - } - } - }); - dataListHtml += '</tr>'; - }); - return dataListHtml; - } - - /** - * 创建按钮 - * @param buttonValue 按钮属性对象 - * @param dataValue 当前行数据对象 - * @returns {string} - */ - function createButton( buttonValue, dataValue ) { - var paramStr = '', buttonStr = '', iconStr = ''; - if( buttonValue.confirm ){ - buttonValue.class += ' confirm'; - }else{ - buttonValue.class += ' refresh'; - } - if( dataValue ){ - paramStr = prepareParamStr( buttonValue, dataValue ); - } - if( buttonValue.icon ){ - iconStr = '<i class="'+buttonValue.icon+'"></i>'; - } - if( buttonValue.show ){ - if( dataValue[buttonValue.show[0]] == buttonValue.show[1] ){ - buttonStr = '<button url="'+buttonValue.href+'" data="'+paramStr+'" type="button" class="btn '+buttonValue.class+'">'+ iconStr + ' ' +buttonValue.info+'</button>'; - } - }else{ - buttonStr = '<button url="'+buttonValue.href+'" data="'+paramStr+'" type="button" class="btn '+buttonValue.class+'">'+ iconStr + ' ' +buttonValue.info+'</button>'; - } - return buttonStr; - } - - /** - * 预处理显示信息 - * @param styleList 当前字段对应的规则对象 - * @param dataValue 当前行数据对象 - * @param fieldName 需要处理的数据的字段名 - * @returns {*} - */ - function prepareInfo( styleList, dataValue, fieldName ) { - var detailInfo; - if( styleList['info'] && styleList['info'].length ){ - detailInfo = styleList['info']; - }else{ - detailInfo = dataValue[fieldName]; - } - return detailInfo; - } - - /** - * 预处理参数信息 - * @param styleList 当前字段对应的规则对象 - * @param dataValue 当前行数据对象 - * @returns {string} - */ - function prepareParamStr( styleList, dataValue ) { - var paramStr = ''; - if( styleList['param'].length ){ - $.each(styleList['param'], function (paramIndex, paramValue) { - paramStr += paramValue + '=' + dataValue[paramValue] + '&'; - }); - paramStr = paramStr.substring(0, paramStr.length-1); - } - return paramStr; - } - - /** - * 创建空数据表 - * @param tableObj - * @returns {string} - */ - function buildEmptyTable( tableObj ) { - var emptyHtml = '<tr>'; - var spanNum = tableObj.header.length + 1; - emptyHtml += '<td colspan="'+spanNum+'" class="builder-data-empty">'; - emptyHtml += '<div class="am-text-center no-data" >'; - emptyHtml += '<i class="fa fa-cogs"></i> 暂时没有数据<br>'; - emptyHtml += '<small> 本系统由<b> '+ COMPANY_NAME +' </b>开发维护</small>'; - emptyHtml += '</div></td></tr>'; - return emptyHtml; - } -})(jQuery); diff --git a/public/admin/static/plugin/bootBox/bootbox.min.js b/public/admin/static/plugin/bootBox/bootbox.min.js deleted file mode 100644 index 0dc0cbd..0000000 --- a/public/admin/static/plugin/bootBox/bootbox.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * bootbox.js v4.4.0 - * - * http://bootboxjs.com/license.txt - */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.bootbox=b(a.jQuery)}(this,function a(b,c){"use strict";function d(a){var b=q[o.locale];return b?b[a]:q.en[a]}function e(a,c,d){a.stopPropagation(),a.preventDefault();var e=b.isFunction(d)&&d.call(c,a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},o,a),a.buttons||(a.buttons={}),c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c,d){var e={className:"bootbox-"+a,buttons:l.apply(null,b)};return m(j(e,d,c),b)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var n={dialog:"<div class='bootbox modal' tabindex='-1' role='dialog'><div class='modal-dialog'><div class='modal-content'><div class='modal-body'><div class='bootbox-body'></div></div></div></div></div>",header:"<div class='modal-header'><h4 class='modal-title'></h4></div>",footer:"<div class='modal-footer'></div>",closeButton:"<button type='button' class='bootbox-close-button close' data-dismiss='modal' aria-hidden='true'>×</button>",form:"<form class='bootbox-form'></form>",inputs:{text:"<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />",textarea:"<textarea class='bootbox-input bootbox-input-textarea form-control'></textarea>",email:"<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />",select:"<select class='bootbox-input bootbox-input-select form-control'></select>",checkbox:"<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>",date:"<input class='bootbox-input bootbox-input-date form-control' autocomplete=off type='date' />",time:"<input class='bootbox-input bootbox-input-time form-control' autocomplete=off type='time' />",number:"<input class='bootbox-input bootbox-input-number form-control' autocomplete=off type='number' />",password:"<input class='bootbox-input bootbox-input-password form-control' autocomplete='off' type='password' />"}},o={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body"},p={};p.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback.call(this):!0},p.dialog(a)},p.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,!1)},a.buttons.confirm.callback=function(){return a.callback.call(this,!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return p.dialog(a)},p.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"textarea":case"email":case"select":case"date":case"time":case"number":case"password":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback.call(this,c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"textarea":case"email":case"date":case"time":case"number":case"password":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!b.isArray(k))throw new Error("Please pass an array of input options");if(!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("<optgroup/>").attr("label",d.group)),e=o[d.group]),e.append("<option value='"+d.value+"'>"+d.text+"</option>")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var q=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("<div/>"),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(q,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),a.pattern&&h.attr("pattern",a.pattern),a.maxlength&&h.attr("maxlength",a.maxlength),f.append(h),f.on("submit",function(a){a.preventDefault(),a.stopPropagation(),e.find(".btn-primary").click()}),e=p.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},p.dialog=function(a){a=h(a);var d=b(n.dialog),f=d.find(".modal-dialog"),i=d.find(".modal-body"),j=a.buttons,k="",l={onEscape:a.onEscape};if(b.fn.modal===c)throw new Error("$.fn.modal is not defined; please double check you have included the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ for more details.");if(g(j,function(a,b){k+="<button data-bb-handler='"+a+"' type='button' class='btn "+b.className+"'>"+b.label+"</button>",l[a]=b.callback}),i.find(".bootbox-body").html(a.message),a.animate===!0&&d.addClass("fade"),a.className&&d.addClass(a.className),"large"===a.size?f.addClass("modal-lg"):"small"===a.size&&f.addClass("modal-sm"),a.title&&i.before(n.header),a.closeButton){var m=b(n.closeButton);a.title?d.find(".modal-header").prepend(m):m.css("margin-top","-10px").prependTo(i)}return a.title&&d.find(".modal-title").html(a.title),k.length&&(i.after(n.footer),d.find(".modal-footer").html(k)),d.on("hidden.bs.modal",function(a){a.target===this&&d.remove()}),d.on("shown.bs.modal",function(){d.find(".btn-primary:first").focus()}),"static"!==a.backdrop&&d.on("click.dismiss.bs.modal",function(a){d.children(".modal-backdrop").length&&(a.currentTarget=d.children(".modal-backdrop").get(0)),a.target===a.currentTarget&&d.trigger("escape.close.bb")}),d.on("escape.close.bb",function(a){l.onEscape&&e(a,d,l.onEscape)}),d.on("click",".modal-footer button",function(a){var c=b(this).data("bb-handler");e(a,d,l[c])}),d.on("click",".bootbox-close-button",function(a){e(a,d,l.onEscape)}),d.on("keyup",function(a){27===a.which&&d.trigger("escape.close.bb")}),b(a.container).append(d),d.modal({backdrop:a.backdrop?"static":!1,keyboard:!1,show:!1}),a.show&&d.modal("show"),d},p.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(o,a)},p.hideAll=function(){return b(".bootbox").modal("hide"),p};var q={bg_BG:{OK:"Ок",CANCEL:"Отказ",CONFIRM:"Потвърждавам"},br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},cs:{OK:"OK",CANCEL:"Zrušit",CONFIRM:"Potvrdit"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},el:{OK:"Εντάξει",CANCEL:"Ακύρωση",CONFIRM:"Επιβεβαίωση"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},et:{OK:"OK",CANCEL:"Katkesta",CONFIRM:"OK"},fa:{OK:"قبول",CANCEL:"لغو",CONFIRM:"تایید"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},he:{OK:"אישור",CANCEL:"ביטול",CONFIRM:"אישור"},hu:{OK:"OK",CANCEL:"Mégsem",CONFIRM:"Megerősít"},hr:{OK:"OK",CANCEL:"Odustani",CONFIRM:"Potvrdi"},id:{OK:"OK",CANCEL:"Batal",CONFIRM:"OK"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},ja:{OK:"OK",CANCEL:"キャンセル",CONFIRM:"確認"},lt:{OK:"Gerai",CANCEL:"Atšaukti",CONFIRM:"Patvirtinti"},lv:{OK:"Labi",CANCEL:"Atcelt",CONFIRM:"Apstiprināt"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},pt:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Confirmar"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},sq:{OK:"OK",CANCEL:"Anulo",CONFIRM:"Prano"},sv:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},th:{OK:"ตกลง",CANCEL:"ยกเลิก",CONFIRM:"ยืนยัน"},tr:{OK:"Tamam",CANCEL:"İptal",CONFIRM:"Onayla"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return p.addLocale=function(a,c){return b.each(["OK","CANCEL","CONFIRM"],function(a,b){if(!c[b])throw new Error("Please supply a translation for '"+b+"'")}),q[a]={OK:c.OK,CANCEL:c.CANCEL,CONFIRM:c.CONFIRM},p},p.removeLocale=function(a){return delete q[a],p},p.setLocale=function(a){return p.setDefaults("locale",a)},p.init=function(c){return a(c||b)},p}); \ No newline at end of file diff --git a/public/admin/static/plugin/bootstrap/css/bootstrap.min.css b/public/admin/static/plugin/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 0d98974..0000000 --- a/public/admin/static/plugin/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 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(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../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:thin dotted;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 #ccc;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 #ddd} .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:#f5f5f5} 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:#f5f5f5} .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:thin dotted;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 #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-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{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)} .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:thin dotted;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 #ccc;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 #ccc;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 #ccc;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}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.eot b/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953fff68df523aa7656497ee339d6026d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20127 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 diff --git a/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.svg b/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 94fb549..0000000 --- a/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,288 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > -<font-face units-per-em="1200" ascent="960" descent="-240" /> -<missing-glyph horiz-adv-x="500" /> -<glyph horiz-adv-x="0" /> -<glyph horiz-adv-x="400" /> -<glyph unicode=" " /> -<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> -<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode=" " /> -<glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> -<glyph unicode=" " horiz-adv-x="650" /> -<glyph unicode=" " horiz-adv-x="1300" /> -<glyph unicode=" " horiz-adv-x="650" /> -<glyph unicode=" " horiz-adv-x="1300" /> -<glyph unicode=" " horiz-adv-x="433" /> -<glyph unicode=" " horiz-adv-x="325" /> -<glyph unicode=" " horiz-adv-x="216" /> -<glyph unicode=" " horiz-adv-x="216" /> -<glyph unicode=" " horiz-adv-x="162" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="325" /> -<glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> -<glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> -<glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> -<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> -<glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> -<glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> -<glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> -<glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> -<glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> -<glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> -<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> -<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> -<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> -<glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> -<glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> -<glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> -<glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> -<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> -<glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> -<glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> -<glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> -<glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> -<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> -<glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> -<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> -<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> -<glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> -<glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> -<glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> -<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> -<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> -<glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> -<glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> -<glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> -<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> -<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> -<glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> -<glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> -<glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> -<glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> -<glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> -<glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> -<glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> -<glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> -<glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> -<glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> -<glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> -<glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> -<glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> -<glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> -<glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> -<glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> -<glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> -<glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> -<glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> -<glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> -<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> -<glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> -<glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> -<glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> -<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> -<glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> -<glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> -<glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> -<glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> -<glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> -<glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> -<glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> -<glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> -<glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> -<glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> -<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> -<glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> -<glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> -<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> -<glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> -<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> -<glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> -<glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> -<glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> -<glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> -<glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> -<glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> -<glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> -<glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> -<glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> -<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> -<glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> -<glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> -<glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> -<glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> -<glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> -<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> -<glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> -<glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> -<glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> -<glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> -<glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> -<glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> -<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> -<glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> -<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> -<glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> -<glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> -<glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> -<glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> -<glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> -<glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> -<glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> -<glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> -<glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> -<glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> -<glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> -<glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> -<glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> -<glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> -<glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> -<glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> -<glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> -<glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> -<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> -<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> -<glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> -<glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> -<glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> -<glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> -<glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> -<glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> -<glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> -<glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> -<glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> -<glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> -<glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> -<glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> -<glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> -<glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> -<glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> -<glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> -<glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> -<glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> -<glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> -<glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> -<glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> -<glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> -<glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> -<glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> -<glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> -<glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> -<glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> -<glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> -<glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> -<glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> -<glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> -<glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> -<glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> -<glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> -<glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> -<glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> -<glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> -<glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> -<glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> -<glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> -<glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> -<glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> -<glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> -<glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> -<glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> -<glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.ttf b/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609ab6f21774de0cb7e01360095584f65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 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 diff --git a/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.woff b/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 9e612858f802245ddcbf59788a0db942224bab35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23424 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 G`u_lkUM?>H diff --git a/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/public/admin/static/plugin/bootstrap/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18028 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 diff --git a/public/admin/static/plugin/bootstrap/js/bootstrap.min.js b/public/admin/static/plugin/bootstrap/js/bootstrap.min.js deleted file mode 100644 index e79c065..0000000 --- a/public/admin/static/plugin/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active"); -d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/public/admin/static/plugin/compatible/html5shiv.js b/public/admin/static/plugin/compatible/html5shiv.js deleted file mode 100644 index 448cebd..0000000 --- a/public/admin/static/plugin/compatible/html5shiv.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed -*/ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document); diff --git a/public/admin/static/plugin/compatible/respond.min.js b/public/admin/static/plugin/compatible/respond.min.js deleted file mode 100644 index 80a7b69..0000000 --- a/public/admin/static/plugin/compatible/respond.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl - * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT - * */ - -!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this); \ No newline at end of file diff --git a/public/admin/static/plugin/fastClick/fastclick.js b/public/admin/static/plugin/fastClick/fastclick.js deleted file mode 100644 index 3af4f9d..0000000 --- a/public/admin/static/plugin/fastClick/fastclick.js +++ /dev/null @@ -1,841 +0,0 @@ -;(function () { - 'use strict'; - - /** - * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs. - * - * @codingstandard ftlabs-jsv2 - * @copyright The Financial Times Limited [All Rights Reserved] - * @license MIT License (see LICENSE.txt) - */ - - /*jslint browser:true, node:true*/ - /*global define, Event, Node*/ - - - /** - * Instantiate fast-clicking listeners on the specified layer. - * - * @constructor - * @param {Element} layer The layer to listen on - * @param {Object} [options={}] The options to override the defaults - */ - function FastClick(layer, options) { - var oldOnClick; - - options = options || {}; - - /** - * Whether a click is currently being tracked. - * - * @type boolean - */ - this.trackingClick = false; - - - /** - * Timestamp for when click tracking started. - * - * @type number - */ - this.trackingClickStart = 0; - - - /** - * The element being tracked for a click. - * - * @type EventTarget - */ - this.targetElement = null; - - - /** - * X-coordinate of touch start event. - * - * @type number - */ - this.touchStartX = 0; - - - /** - * Y-coordinate of touch start event. - * - * @type number - */ - this.touchStartY = 0; - - - /** - * ID of the last touch, retrieved from Touch.identifier. - * - * @type number - */ - this.lastTouchIdentifier = 0; - - - /** - * Touchmove boundary, beyond which a click will be cancelled. - * - * @type number - */ - this.touchBoundary = options.touchBoundary || 10; - - - /** - * The FastClick layer. - * - * @type Element - */ - this.layer = layer; - - /** - * The minimum time between tap(touchstart and touchend) events - * - * @type number - */ - this.tapDelay = options.tapDelay || 200; - - /** - * The maximum time for a tap - * - * @type number - */ - this.tapTimeout = options.tapTimeout || 700; - - if (FastClick.notNeeded(layer)) { - return; - } - - // Some old versions of Android don't have Function.prototype.bind - function bind(method, context) { - return function() { return method.apply(context, arguments); }; - } - - - var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel']; - var context = this; - for (var i = 0, l = methods.length; i < l; i++) { - context[methods[i]] = bind(context[methods[i]], context); - } - - // Set up event handlers as required - if (deviceIsAndroid) { - layer.addEventListener('mouseover', this.onMouse, true); - layer.addEventListener('mousedown', this.onMouse, true); - layer.addEventListener('mouseup', this.onMouse, true); - } - - layer.addEventListener('click', this.onClick, true); - layer.addEventListener('touchstart', this.onTouchStart, false); - layer.addEventListener('touchmove', this.onTouchMove, false); - layer.addEventListener('touchend', this.onTouchEnd, false); - layer.addEventListener('touchcancel', this.onTouchCancel, false); - - // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) - // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick - // layer when they are cancelled. - if (!Event.prototype.stopImmediatePropagation) { - layer.removeEventListener = function(type, callback, capture) { - var rmv = Node.prototype.removeEventListener; - if (type === 'click') { - rmv.call(layer, type, callback.hijacked || callback, capture); - } else { - rmv.call(layer, type, callback, capture); - } - }; - - layer.addEventListener = function(type, callback, capture) { - var adv = Node.prototype.addEventListener; - if (type === 'click') { - adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) { - if (!event.propagationStopped) { - callback(event); - } - }), capture); - } else { - adv.call(layer, type, callback, capture); - } - }; - } - - // If a handler is already declared in the element's onclick attribute, it will be fired before - // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and - // adding it as listener. - if (typeof layer.onclick === 'function') { - - // Android browser on at least 3.2 requires a new reference to the function in layer.onclick - // - the old one won't work if passed to addEventListener directly. - oldOnClick = layer.onclick; - layer.addEventListener('click', function(event) { - oldOnClick(event); - }, false); - layer.onclick = null; - } - } - - /** - * Windows Phone 8.1 fakes user agent string to look like Android and iPhone. - * - * @type boolean - */ - var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0; - - /** - * Android requires exceptions. - * - * @type boolean - */ - var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone; - - - /** - * iOS requires exceptions. - * - * @type boolean - */ - var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone; - - - /** - * iOS 4 requires an exception for select elements. - * - * @type boolean - */ - var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent); - - - /** - * iOS 6.0-7.* requires the target element to be manually derived - * - * @type boolean - */ - var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent); - - /** - * BlackBerry requires exceptions. - * - * @type boolean - */ - var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0; - - /** - * Determine whether a given element requires a native click. - * - * @param {EventTarget|Element} target Target DOM element - * @returns {boolean} Returns true if the element needs a native click - */ - FastClick.prototype.needsClick = function(target) { - switch (target.nodeName.toLowerCase()) { - - // Don't send a synthetic click to disabled inputs (issue #62) - case 'button': - case 'select': - case 'textarea': - if (target.disabled) { - return true; - } - - break; - case 'input': - - // File inputs need real clicks on iOS 6 due to a browser bug (issue #68) - if ((deviceIsIOS && target.type === 'file') || target.disabled) { - return true; - } - - break; - case 'label': - case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames - case 'video': - return true; - } - - return (/\bneedsclick\b/).test(target.className); - }; - - - /** - * Determine whether a given element requires a call to focus to simulate click into element. - * - * @param {EventTarget|Element} target Target DOM element - * @returns {boolean} Returns true if the element requires a call to focus to simulate native click. - */ - FastClick.prototype.needsFocus = function(target) { - switch (target.nodeName.toLowerCase()) { - case 'textarea': - return true; - case 'select': - return !deviceIsAndroid; - case 'input': - switch (target.type) { - case 'button': - case 'checkbox': - case 'file': - case 'image': - case 'radio': - case 'submit': - return false; - } - - // No point in attempting to focus disabled inputs - return !target.disabled && !target.readOnly; - default: - return (/\bneedsfocus\b/).test(target.className); - } - }; - - - /** - * Send a click event to the specified element. - * - * @param {EventTarget|Element} targetElement - * @param {Event} event - */ - FastClick.prototype.sendClick = function(targetElement, event) { - var clickEvent, touch; - - // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) - if (document.activeElement && document.activeElement !== targetElement) { - document.activeElement.blur(); - } - - touch = event.changedTouches[0]; - - // Synthesise a click event, with an extra attribute so it can be tracked - clickEvent = document.createEvent('MouseEvents'); - clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); - clickEvent.forwardedTouchEvent = true; - targetElement.dispatchEvent(clickEvent); - }; - - FastClick.prototype.determineEventType = function(targetElement) { - - //Issue #159: Android Chrome Select Box does not open with a synthetic click event - if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') { - return 'mousedown'; - } - - return 'click'; - }; - - - /** - * @param {EventTarget|Element} targetElement - */ - FastClick.prototype.focus = function(targetElement) { - var length; - - // Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724. - if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') { - length = targetElement.value.length; - targetElement.setSelectionRange(length, length); - } else { - targetElement.focus(); - } - }; - - - /** - * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it. - * - * @param {EventTarget|Element} targetElement - */ - FastClick.prototype.updateScrollParent = function(targetElement) { - var scrollParent, parentElement; - - scrollParent = targetElement.fastClickScrollParent; - - // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the - // target element was moved to another parent. - if (!scrollParent || !scrollParent.contains(targetElement)) { - parentElement = targetElement; - do { - if (parentElement.scrollHeight > parentElement.offsetHeight) { - scrollParent = parentElement; - targetElement.fastClickScrollParent = parentElement; - break; - } - - parentElement = parentElement.parentElement; - } while (parentElement); - } - - // Always update the scroll top tracker if possible. - if (scrollParent) { - scrollParent.fastClickLastScrollTop = scrollParent.scrollTop; - } - }; - - - /** - * @param {EventTarget} targetElement - * @returns {Element|EventTarget} - */ - FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) { - - // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node. - if (eventTarget.nodeType === Node.TEXT_NODE) { - return eventTarget.parentNode; - } - - return eventTarget; - }; - - - /** - * On touch start, record the position and scroll offset. - * - * @param {Event} event - * @returns {boolean} - */ - FastClick.prototype.onTouchStart = function(event) { - var targetElement, touch, selection; - - // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111). - if (event.targetTouches.length > 1) { - return true; - } - - targetElement = this.getTargetElementFromEventTarget(event.target); - touch = event.targetTouches[0]; - - if (deviceIsIOS) { - - // Only trusted events will deselect text on iOS (issue #49) - selection = window.getSelection(); - if (selection.rangeCount && !selection.isCollapsed) { - return true; - } - - if (!deviceIsIOS4) { - - // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23): - // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched - // with the same identifier as the touch event that previously triggered the click that triggered the alert. - // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an - // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform. - // Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string, - // which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long, - // random integers, it's safe to to continue if the identifier is 0 here. - if (touch.identifier && touch.identifier === this.lastTouchIdentifier) { - event.preventDefault(); - return false; - } - - this.lastTouchIdentifier = touch.identifier; - - // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and: - // 1) the user does a fling scroll on the scrollable layer - // 2) the user stops the fling scroll with another tap - // then the event.target of the last 'touchend' event will be the element that was under the user's finger - // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check - // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42). - this.updateScrollParent(targetElement); - } - } - - this.trackingClick = true; - this.trackingClickStart = event.timeStamp; - this.targetElement = targetElement; - - this.touchStartX = touch.pageX; - this.touchStartY = touch.pageY; - - // Prevent phantom clicks on fast double-tap (issue #36) - if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { - event.preventDefault(); - } - - return true; - }; - - - /** - * Based on a touchmove event object, check whether the touch has moved past a boundary since it started. - * - * @param {Event} event - * @returns {boolean} - */ - FastClick.prototype.touchHasMoved = function(event) { - var touch = event.changedTouches[0], boundary = this.touchBoundary; - - if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { - return true; - } - - return false; - }; - - - /** - * Update the last position. - * - * @param {Event} event - * @returns {boolean} - */ - FastClick.prototype.onTouchMove = function(event) { - if (!this.trackingClick) { - return true; - } - - // If the touch has moved, cancel the click tracking - if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) { - this.trackingClick = false; - this.targetElement = null; - } - - return true; - }; - - - /** - * Attempt to find the labelled control for the given label element. - * - * @param {EventTarget|HTMLLabelElement} labelElement - * @returns {Element|null} - */ - FastClick.prototype.findControl = function(labelElement) { - - // Fast path for newer browsers supporting the HTML5 control attribute - if (labelElement.control !== undefined) { - return labelElement.control; - } - - // All browsers under test that support touch events also support the HTML5 htmlFor attribute - if (labelElement.htmlFor) { - return document.getElementById(labelElement.htmlFor); - } - - // If no for attribute exists, attempt to retrieve the first labellable descendant element - // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label - return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea'); - }; - - - /** - * On touch end, determine whether to send a click event at once. - * - * @param {Event} event - * @returns {boolean} - */ - FastClick.prototype.onTouchEnd = function(event) { - var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement; - - if (!this.trackingClick) { - return true; - } - - // Prevent phantom clicks on fast double-tap (issue #36) - if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { - this.cancelNextClick = true; - return true; - } - - if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) { - return true; - } - - // Reset to prevent wrong click cancel on input (issue #156). - this.cancelNextClick = false; - - this.lastClickTime = event.timeStamp; - - trackingClickStart = this.trackingClickStart; - this.trackingClick = false; - this.trackingClickStart = 0; - - // On some iOS devices, the targetElement supplied with the event is invalid if the layer - // is performing a transition or scroll, and has to be re-detected manually. Note that - // for this to function correctly, it must be called *after* the event target is checked! - // See issue #57; also filed as rdar://13048589 . - if (deviceIsIOSWithBadTarget) { - touch = event.changedTouches[0]; - - // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null - targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement; - targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent; - } - - targetTagName = targetElement.tagName.toLowerCase(); - if (targetTagName === 'label') { - forElement = this.findControl(targetElement); - if (forElement) { - this.focus(targetElement); - if (deviceIsAndroid) { - return false; - } - - targetElement = forElement; - } - } else if (this.needsFocus(targetElement)) { - - // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through. - // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37). - if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) { - this.targetElement = null; - return false; - } - - this.focus(targetElement); - this.sendClick(targetElement, event); - - // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open. - // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others) - if (!deviceIsIOS || targetTagName !== 'select') { - this.targetElement = null; - event.preventDefault(); - } - - return false; - } - - if (deviceIsIOS && !deviceIsIOS4) { - - // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled - // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42). - scrollParent = targetElement.fastClickScrollParent; - if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) { - return true; - } - } - - // Prevent the actual click from going though - unless the target node is marked as requiring - // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted. - if (!this.needsClick(targetElement)) { - event.preventDefault(); - this.sendClick(targetElement, event); - } - - return false; - }; - - - /** - * On touch cancel, stop tracking the click. - * - * @returns {void} - */ - FastClick.prototype.onTouchCancel = function() { - this.trackingClick = false; - this.targetElement = null; - }; - - - /** - * Determine mouse events which should be permitted. - * - * @param {Event} event - * @returns {boolean} - */ - FastClick.prototype.onMouse = function(event) { - - // If a target element was never set (because a touch event was never fired) allow the event - if (!this.targetElement) { - return true; - } - - if (event.forwardedTouchEvent) { - return true; - } - - // Programmatically generated events targeting a specific element should be permitted - if (!event.cancelable) { - return true; - } - - // Derive and check the target element to see whether the mouse event needs to be permitted; - // unless explicitly enabled, prevent non-touch click events from triggering actions, - // to prevent ghost/doubleclicks. - if (!this.needsClick(this.targetElement) || this.cancelNextClick) { - - // Prevent any user-added listeners declared on FastClick element from being fired. - if (event.stopImmediatePropagation) { - event.stopImmediatePropagation(); - } else { - - // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) - event.propagationStopped = true; - } - - // Cancel the event - event.stopPropagation(); - event.preventDefault(); - - return false; - } - - // If the mouse event is permitted, return true for the action to go through. - return true; - }; - - - /** - * On actual clicks, determine whether this is a touch-generated click, a click action occurring - * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or - * an actual click which should be permitted. - * - * @param {Event} event - * @returns {boolean} - */ - FastClick.prototype.onClick = function(event) { - var permitted; - - // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early. - if (this.trackingClick) { - this.targetElement = null; - this.trackingClick = false; - return true; - } - - // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target. - if (event.target.type === 'submit' && event.detail === 0) { - return true; - } - - permitted = this.onMouse(event); - - // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through. - if (!permitted) { - this.targetElement = null; - } - - // If clicks are permitted, return true for the action to go through. - return permitted; - }; - - - /** - * Remove all FastClick's event listeners. - * - * @returns {void} - */ - FastClick.prototype.destroy = function() { - var layer = this.layer; - - if (deviceIsAndroid) { - layer.removeEventListener('mouseover', this.onMouse, true); - layer.removeEventListener('mousedown', this.onMouse, true); - layer.removeEventListener('mouseup', this.onMouse, true); - } - - layer.removeEventListener('click', this.onClick, true); - layer.removeEventListener('touchstart', this.onTouchStart, false); - layer.removeEventListener('touchmove', this.onTouchMove, false); - layer.removeEventListener('touchend', this.onTouchEnd, false); - layer.removeEventListener('touchcancel', this.onTouchCancel, false); - }; - - - /** - * Check whether FastClick is needed. - * - * @param {Element} layer The layer to listen on - */ - FastClick.notNeeded = function(layer) { - var metaViewport; - var chromeVersion; - var blackberryVersion; - var firefoxVersion; - - // Devices that don't support touch don't need FastClick - if (typeof window.ontouchstart === 'undefined') { - return true; - } - - // Chrome version - zero for other browsers - chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; - - if (chromeVersion) { - - if (deviceIsAndroid) { - metaViewport = document.querySelector('meta[name=viewport]'); - - if (metaViewport) { - // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89) - if (metaViewport.content.indexOf('user-scalable=no') !== -1) { - return true; - } - // Chrome 32 and above with width=device-width or less don't need FastClick - if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) { - return true; - } - } - - // Chrome desktop doesn't need FastClick (issue #15) - } else { - return true; - } - } - - if (deviceIsBlackBerry10) { - blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/); - - // BlackBerry 10.3+ does not require Fastclick library. - // https://github.com/ftlabs/fastclick/issues/251 - if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) { - metaViewport = document.querySelector('meta[name=viewport]'); - - if (metaViewport) { - // user-scalable=no eliminates click delay. - if (metaViewport.content.indexOf('user-scalable=no') !== -1) { - return true; - } - // width=device-width (or less than device-width) eliminates click delay. - if (document.documentElement.scrollWidth <= window.outerWidth) { - return true; - } - } - } - } - - // IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97) - if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') { - return true; - } - - // Firefox version - zero for other browsers - firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; - - if (firefoxVersion >= 27) { - // Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896 - - metaViewport = document.querySelector('meta[name=viewport]'); - if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) { - return true; - } - } - - // IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version - // http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx - if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') { - return true; - } - - return false; - }; - - - /** - * Factory method for creating a FastClick object - * - * @param {Element} layer The layer to listen on - * @param {Object} [options={}] The options to override the defaults - */ - FastClick.attach = function(layer, options) { - return new FastClick(layer, options); - }; - - - if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { - - // AMD. Register as an anonymous module. - define(function() { - return FastClick; - }); - } else if (typeof module !== 'undefined' && module.exports) { - module.exports = FastClick.attach; - module.exports.FastClick = FastClick; - } else { - window.FastClick = FastClick; - } -}()); diff --git a/public/admin/static/plugin/fastClick/fastclick.min.js b/public/admin/static/plugin/fastClick/fastclick.min.js deleted file mode 100644 index 131e29e..0000000 --- a/public/admin/static/plugin/fastClick/fastclick.min.js +++ /dev/null @@ -1 +0,0 @@ -!function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[s]={exports:{}};t[s][0].call(u.exports,function(e){var n=t[s][1][e];return i(n?n:e)},u,u.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s<r.length;s++)i(r[s]);return i}({1:[function(e,t){!function(){"use strict";function e(t,n){function i(e,t){return function(){return e.apply(t,arguments)}}var o;if(n=n||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=n.touchBoundary||10,this.layer=t,this.tapDelay=n.tapDelay||200,this.tapTimeout=n.tapTimeout||700,!e.notNeeded(t)){for(var s=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],a=this,c=0,l=s.length;l>c;c++)a[s[c]]=i(a[s[c]],a);r&&(t.addEventListener("mouseover",this.onMouse,!0),t.addEventListener("mousedown",this.onMouse,!0),t.addEventListener("mouseup",this.onMouse,!0)),t.addEventListener("click",this.onClick,!0),t.addEventListener("touchstart",this.onTouchStart,!1),t.addEventListener("touchmove",this.onTouchMove,!1),t.addEventListener("touchend",this.onTouchEnd,!1),t.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(t.removeEventListener=function(e,n,r){var i=Node.prototype.removeEventListener;"click"===e?i.call(t,e,n.hijacked||n,r):i.call(t,e,n,r)},t.addEventListener=function(e,n,r){var i=Node.prototype.addEventListener;"click"===e?i.call(t,e,n.hijacked||(n.hijacked=function(e){e.propagationStopped||n(e)}),r):i.call(t,e,n,r)}),"function"==typeof t.onclick&&(o=t.onclick,t.addEventListener("click",function(e){o(e)},!1),t.onclick=null)}}var n=navigator.userAgent.indexOf("Windows Phone")>=0,r=navigator.userAgent.indexOf("Android")>0&&!n,i=/iP(ad|hone|od)/.test(navigator.userAgent)&&!n,o=i&&/OS 4_\d(_\d)?/.test(navigator.userAgent),s=i&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;e.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(i&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},e.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!r;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},e.prototype.sendClick=function(e,t){var n,r;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),r=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},e.prototype.determineEventType=function(e){return r&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},e.prototype.focus=function(e){var t;i&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},e.prototype.updateScrollParent=function(e){var t,n;if(t=e.fastClickScrollParent,!t||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},e.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},e.prototype.onTouchStart=function(e){var t,n,r;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],i){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!o){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTime<this.tapDelay&&e.preventDefault(),!0},e.prototype.touchHasMoved=function(e){var t=e.changedTouches[0],n=this.touchBoundary;return Math.abs(t.pageX-this.touchStartX)>n||Math.abs(t.pageY-this.touchStartY)>n?!0:!1},e.prototype.onTouchMove=function(e){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},e.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},e.prototype.onTouchEnd=function(e){var t,n,a,c,l,u=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTime<this.tapDelay)return this.cancelNextClick=!0,!0;if(e.timeStamp-this.trackingClickStart>this.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,s&&(l=e.changedTouches[0],u=document.elementFromPoint(l.pageX-window.pageXOffset,l.pageY-window.pageYOffset)||u,u.fastClickScrollParent=this.targetElement.fastClickScrollParent),a=u.tagName.toLowerCase(),"label"===a){if(t=this.findControl(u)){if(this.focus(u),r)return!1;u=t}}else if(this.needsFocus(u))return e.timeStamp-n>100||i&&window.top!==window&&"input"===a?(this.targetElement=null,!1):(this.focus(u),this.sendClick(u,e),i&&"select"===a||(this.targetElement=null,e.preventDefault()),!1);return i&&!o&&(c=u.fastClickScrollParent,c&&c.fastClickLastScrollTop!==c.scrollTop)?!0:(this.needsClick(u)||(e.preventDefault(),this.sendClick(u,e)),!1)},e.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},e.prototype.onMouse=function(e){return this.targetElement?e.forwardedTouchEvent?!0:e.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1):!0:!0},e.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail?!0:(t=this.onMouse(e),t||(this.targetElement=null),t)},e.prototype.destroy=function(){var e=this.layer;r&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},e.notNeeded=function(e){var t,n,i,o;if("undefined"==typeof window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!r)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(i=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),i[1]>=10&&i[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction?!0:(o=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],o>=27&&(t=document.querySelector("meta[name=viewport]"),t&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===e.style.touchAction||"manipulation"===e.style.touchAction?!0:!1)},e.attach=function(t,n){return new e(t,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return e}):"undefined"!=typeof t&&t.exports?(t.exports=e.attach,t.exports.FastClick=e):window.FastClick=e}()},{}],2:[function(e){window.Origami={fastclick:e("./bower_components/fastclick/lib/fastclick.js")}},{"./bower_components/fastclick/lib/fastclick.js":1}]},{},[2]);;(function() {function trigger(){document.dispatchEvent(new CustomEvent('o.load'))};document.addEventListener('load',trigger);if (document.readyState==='ready') trigger();}());(function() {function trigger(){document.dispatchEvent(new CustomEvent('o.DOMContentLoaded'))};document.addEventListener('DOMContentLoaded',trigger);if (document.readyState==='interactive') trigger();}()) \ No newline at end of file diff --git a/public/admin/static/plugin/index.html b/public/admin/static/plugin/index.html deleted file mode 100644 index e69de29..0000000 diff --git a/public/admin/static/plugin/jQuery/1.12.4/jquery.js b/public/admin/static/plugin/jQuery/1.12.4/jquery.js deleted file mode 100644 index 7fc60fc..0000000 --- a/public/admin/static/plugin/jQuery/1.12.4/jquery.js +++ /dev/null @@ -1,11008 +0,0 @@ -/*! - * jQuery JavaScript Library v1.12.4 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-05-20T17:17Z - */ - -(function( global, factory ) { - - if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Support: Firefox 18+ -// Can't be in strict mode, several libs including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -//"use strict"; -var deletedIds = []; - -var document = window.document; - -var slice = deletedIds.slice; - -var concat = deletedIds.concat; - -var push = deletedIds.push; - -var indexOf = deletedIds.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var support = {}; - - - -var - version = "1.12.4", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android<4.1, IE<9 - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: deletedIds.sort, - splice: deletedIds.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type( obj ) === "array"; - }, - - isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - var realStringObj = obj && obj.toString(); - return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - isPlainObject: function( obj ) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call( obj, "constructor" ) && - !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - } catch ( e ) { - - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( !support.ownFirst ) { - for ( key in obj ) { - return hasOwn.call( obj, key ); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android<4.1, IE<9 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( indexOf ) { - return indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - while ( j < len ) { - first[ i++ ] = second[ j++ ]; - } - - // Support: IE<9 - // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) - if ( len !== len ) { - while ( second[ j ] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var args, proxy, tmp; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: function() { - return +( new Date() ); - }, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -// JSHint would error on this code due to the Symbol not being defined in ES5. -// Defining this global in .jshintrc would create a danger of using the global -// unguarded in another place, it seems safer to just disable JSHint for these -// three lines. -/* jshint ignore: start */ -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; -} -/* jshint ignore: end */ - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: iOS 8.2 (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.2.1 - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2015-10-17 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, nidselect, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; - while ( i-- ) { - groups[i] = nidselect + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( (parent = document.defaultView) && parent.top !== parent ) { - // Support: IE 11 - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( document.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - return m ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" + - "<select id='" + expando + "-\r\\' msallowcapture=''>" + - "<option selected=''></option></select>"; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( (oldCache = uniqueCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = "<a href='#'></a>"; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = "<input/>"; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - } ); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // init accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt( 0 ) === "<" && - selector.charAt( selector.length - 1 ) === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[ 2 ] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[ 0 ] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof root.ready !== "undefined" ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; - - return this.filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( pos ? - pos.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[ 0 ], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem, this ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - ret = jQuery.uniqueSort( ret ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - } - - return this.pushStack( ret ); - }; -} ); -var rnotwhite = ( /\S+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = true; - if ( !memory ) { - self.disable(); - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], - [ "notify", "progress", jQuery.Callbacks( "memory" ) ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this === promise ? newDefer.promise() : this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( function() { - - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || - ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. - // If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .progress( updateFunc( i, progressContexts, progressValues ) ) - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -} ); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -} ); - -/** - * Clean-up method for dom ready events - */ -function detach() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } -} - -/** - * The ready event handler and self cleanup method - */ -function completed() { - - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || - window.event.type === "load" || - document.readyState === "complete" ) { - - detach(); - jQuery.ready(); - } -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called - // after the browser event has already occurred. - // Support: IE6-10 - // Older IE sometimes signals "interactive" too soon - if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); - - // If IE event model is used - } else { - - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch ( e ) {} - - if ( top && top.doScroll ) { - ( function doScrollCheck() { - if ( !jQuery.isReady ) { - - try { - - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll( "left" ); - } catch ( e ) { - return window.setTimeout( doScrollCheck, 50 ); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - } )(); - } - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Support: IE<9 -// Iteration over object's inherited properties before its own -var i; -for ( i in jQuery( support ) ) { - break; -} -support.ownFirst = i === "0"; - -// Note: most support tests are defined in their respective modules. -// false until the test is run -support.inlineBlockNeedsLayout = false; - -// Execute ASAP in case we need to set body.style.zoom -jQuery( function() { - - // Minified: var a,b,c,d - var val, div, body, container; - - body = document.getElementsByTagName( "body" )[ 0 ]; - if ( !body || !body.style ) { - - // Return for frameset docs that don't have a body - return; - } - - // Setup - div = document.createElement( "div" ); - container = document.createElement( "div" ); - container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; - body.appendChild( container ).appendChild( div ); - - if ( typeof div.style.zoom !== "undefined" ) { - - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; - - support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; - if ( val ) { - - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild( container ); -} ); - - -( function() { - var div = document.createElement( "div" ); - - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch ( e ) { - support.deleteExpando = false; - } - - // Null elements to avoid leaks in IE. - div = null; -} )(); -var acceptData = function( elem ) { - var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], - nodeType = +elem.nodeType || 1; - - // Do not set data on non-element DOM nodes because it will not be cleared (#8335). - return nodeType !== 1 && nodeType !== 9 ? - false : - - // Nodes accept data unless otherwise specified; rejection can be conditional - !noData || noData !== true && elem.getAttribute( "classid" ) === noData; -}; - - - - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - -function dataAttr( elem, key, data ) { - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - -function internalData( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !acceptData( elem ) ) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && - data === undefined && typeof name === "string" ) { - return; - } - - if ( !id ) { - - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; -} - -function internalRemoveData( elem, name, pvt ) { - if ( !acceptData( elem ) ) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split( " " ); - } - } - } else { - - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } - - i = name.length; - while ( i-- ) { - delete thisCache[ name[ i ] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; - - // When all else fails, undefined - } else { - cache[ id ] = undefined; - } -} - -jQuery.extend( { - cache: {}, - - // The following elements (space-suffixed to avoid Object.prototype collisions) - // throw uncatchable exceptions if you attempt to set expando properties - noData: { - "applet ": true, - "embed ": true, - - // ...but Flash objects (which have this classid) *can* handle expandos - "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data ) { - return internalData( elem, name, data ); - }, - - removeData: function( elem, name ) { - return internalRemoveData( elem, name ); - }, - - // For internal use only. - _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); - }, - - _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - jQuery.data( this, key ); - } ); - } - - return arguments.length > 1 ? - - // Sets one value - this.each( function() { - jQuery.data( this, key, value ); - } ) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; - }, - - removeData: function( key ) { - return this.each( function() { - jQuery.removeData( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, - // or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); - - -( function() { - var shrinkWrapBlocksVal; - - support.shrinkWrapBlocks = function() { - if ( shrinkWrapBlocksVal != null ) { - return shrinkWrapBlocksVal; - } - - // Will be changed later if needed. - shrinkWrapBlocksVal = false; - - // Minified: var b,c,d - var div, body, container; - - body = document.getElementsByTagName( "body" )[ 0 ]; - if ( !body || !body.style ) { - - // Test fired too early or in an unsupported environment, exit. - return; - } - - // Setup - div = document.createElement( "div" ); - container = document.createElement( "div" ); - container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; - body.appendChild( container ).appendChild( div ); - - // Support: IE6 - // Check if elements with layout shrink-wrap their children - if ( typeof div.style.zoom !== "undefined" ) { - - // Reset CSS: box-sizing; display; margin; border - div.style.cssText = - - // Support: Firefox<29, Android 2.3 - // Vendor-prefix box-sizing - "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + - "box-sizing:content-box;display:block;margin:0;border:0;" + - "padding:1px;width:1px;zoom:1"; - div.appendChild( document.createElement( "div" ) ).style.width = "5px"; - shrinkWrapBlocksVal = div.offsetWidth !== 3; - } - - body.removeChild( container ); - - return shrinkWrapBlocksVal; - }; - -} )(); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || - !jQuery.contains( elem.ownerDocument, elem ); - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { return tween.cur(); } : - function() { return jQuery.css( elem, prop, "" ); }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( - elems[ i ], - key, - raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[ 0 ], key ) : emptyGet; -}; -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([\w:-]+)/ ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - -var rleadingWhitespace = ( /^\s+/ ); - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + - "details|dialog|figcaption|figure|footer|header|hgroup|main|" + - "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; - - - -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - - -( function() { - var div = document.createElement( "div" ), - fragment = document.createDocumentFragment(), - input = document.createElement( "input" ); - - // Setup - div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName( "tbody" ).length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = - document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>"; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - input.type = "checkbox"; - input.checked = true; - fragment.appendChild( input ); - support.appendChecked = input.checked; - - // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE6-IE11+ - div.innerHTML = "<textarea>x</textarea>"; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // #11217 - WebKit loses check when the name is after the checked attribute - fragment.appendChild( div ); - - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input = document.createElement( "input" ); - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<9 - // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ - support.noCloneEvent = !!div.addEventListener; - - // Support: IE<9 - // Since attributes and properties are the same in IE, - // cleanData must set properties to undefined rather than use removeAttribute - div[ jQuery.expando ] = 1; - support.attributes = !div.getAttribute( jQuery.expando ); -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - option: [ 1, "<select multiple='multiple'>", "</select>" ], - legend: [ 1, "<fieldset>", "</fieldset>" ], - area: [ 1, "<map>", "</map>" ], - - // Support: IE8 - param: [ 1, "<object>", "</object>" ], - thead: [ 1, "<table>", "</table>" ], - tr: [ 2, "<table><tbody>", "</tbody></table>" ], - col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], - td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ] -}; - -// Support: IE8-IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== "undefined" ? - context.querySelectorAll( tag || "*" ) : - undefined; - - if ( !found ) { - for ( found = [], elems = context.childNodes || context; - ( elem = elems[ i ] ) != null; - i++ - ) { - if ( !tag || jQuery.nodeName( elem, tag ) ) { - found.push( elem ); - } else { - jQuery.merge( found, getAll( elem, tag ) ); - } - } - } - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; ( elem = elems[ i ] ) != null; i++ ) { - jQuery._data( - elem, - "globalEval", - !refElements || jQuery._data( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/, - rtbody = /<tbody/i; - -function fixDefaultChecked( elem ) { - if ( rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -function buildFragment( elems, context, scripts, selection, ignored ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - - nodes = [], - i = 0; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) ); - } - - // Remove IE's autoinserted <tbody> from table fragments - if ( !support.tbody ) { - - // String was a <table>, *may* have spurious <tbody> - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare <thead> or <tfoot> - wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && - !tbody.childNodes.length ) { - - elem.removeChild( tbody ); - } - } - } - - jQuery.merge( nodes, tmp.childNodes ); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - tmp = null; - - return safe; -} - - -( function() { - var i, eventName, - div = document.createElement( "div" ); - - // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) - for ( i in { submit: true, change: true, focusin: true } ) { - eventName = "on" + i; - - if ( !( support[ i ] = eventName in window ) ) { - - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - div.setAttribute( eventName, "t" ); - support[ i ] = div.attributes[ eventName ].expando === false; - } - } - - // Null elements to avoid leaks in IE. - div = null; -} )(); - - -var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE9 -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && - ( !e || jQuery.event.triggered !== e.type ) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - - // Add elem as a property of the handle fn to prevent a memory leak - // with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && - jQuery._data( cur, "handle" ); - - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( - ( !special._default || - special._default.apply( eventPath.pop(), data ) === false - ) && acceptData( elem ) - ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Support (at least): Chrome, IE9 - // Find delegate handlers - // Black-hole SVG <use> instance trees (#13180) - // - // Support: Firefox<=42+ - // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) - if ( delegateCount && cur.nodeType && - ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { - - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push( { elem: cur, handlers: matches } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Safari 6-8+ - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + - "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split( " " ), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: ( "button buttons clientX clientY fromElement offsetX offsetY " + - "pageX pageY screenX screenY toElement" ).split( " " ), - filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + - ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + - ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? - original.toElement : - fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - // Piggyback on a donor event to simulate a different one - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - - // Previously, `originalEvent: {}` was set here, so stopPropagation call - // would not be triggered on donor event, since in our own - // jQuery.event.stopPropagation function we had a check for existence of - // originalEvent.stopPropagation method, so, consequently it would be a noop. - // - // Guard for simulated events was moved to jQuery.event.stopPropagation function - // since `originalEvent` should point to the original event for the - // constancy with other events and for more focused logic - } - ); - - jQuery.event.trigger( e, null, elem ); - - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, - // to properly expose it to GC - if ( typeof elem[ name ] === "undefined" ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: IE < 9, Android < 4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( !e || this.isSimulated ) { - return; - } - - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && e.stopImmediatePropagation ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://code.google.com/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -// IE submit delegation -if ( !support.submit ) { - - jQuery.event.special.submit = { - setup: function() { - - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? - - // Support: IE <=8 - // We use jQuery.prop instead of elem.form - // to allow fixing the IE8 delegated submit issue (gh-2332) - // by 3rd party polyfills/workarounds. - jQuery.prop( elem, "form" ) : - undefined; - - if ( form && !jQuery._data( form, "submit" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submitBubble = true; - } ); - jQuery._data( form, "submit", true ); - } - } ); - - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - - // If form was submitted by the user, bubble the event up the tree - if ( event._submitBubble ) { - delete event._submitBubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event ); - } - } - }, - - teardown: function() { - - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !support.change ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._justChanged = true; - } - } ); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._justChanged && !event.isTrigger ) { - this._justChanged = false; - } - - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event ); - } ); - } - return false; - } - - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event ); - } - } ); - jQuery._data( elem, "change", true ); - } - } ); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || - ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { - - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Support: Firefox -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome, Safari -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - jQuery._removeData( doc, fix ); - } else { - jQuery._data( doc, fix, attaches ); - } - } - }; - } ); -} - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - }, - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, - - // Support: IE 10-11, Edge 10240+ - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /<script|<style|<link/i, - - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); - -// Support: IE<8 -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName( "tbody" )[ 0 ] || - elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - return elem; -} - -function cloneCopyEvent( src, dest ) { - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { - return; - } - - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; - - if ( events ) { - delete curData.handle; - curData.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); - - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( - ( node.text || node.textContent || node.innerHTML || "" ) - .replace( rcleanScript, "" ) - ); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - elems = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = elems[ i ] ) != null; i++ ) { - - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1></$2>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains( elem.ownerDocument, elem ); - - if ( support.html5Clone || jQuery.isXMLDoc( elem ) || - !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( ( !support.noCloneEvent || !support.noCloneChecked ) && - ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - // Fix all IE cloning issues - for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { - - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[ i ] ) { - fixCloneNodeIssues( node, destElements[ i ] ); - } - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { - cloneCopyEvent( node, destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - cleanData: function( elems, /* internal */ forceAcceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - attributes = support.attributes, - special = jQuery.event.special; - - for ( ; ( elem = elems[ i ] ) != null; i++ ) { - if ( forceAcceptData || acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // Support: IE<9 - // IE does not allow us to delete expando properties from nodes - // IE creates expando attributes along with the property - // IE does not have a removeAttribute function on Document nodes - if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { - elem.removeAttribute( internalKey ); - - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://code.google.com/p/chromium/issues/detail?id=378607 - } else { - elem[ internalKey ] = undefined; - } - - deletedIds.push( id ); - } - } - } - } - } -} ); - -jQuery.fn.extend( { - - // Keep domManip exposed until 3.0 (gh-2225) - domManip: domManip, - - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( - ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) - ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - - // Remove element nodes and prevent memory leaks - elem = this[ i ] || {}; - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - i = 0, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); - - -var iframe, - elemdisplay = { - - // Support: Firefox - // We have to pre-define these values for FF (#10227) - HTML: "block", - BODY: "block" - }; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ - -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - display = jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) ) - .appendTo( doc.documentElement ); - - // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse - doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document; - - // Support: IE - doc.write(); - doc.close(); - - display = actualDisplay( nodeName, doc ); - iframe.detach(); - } - - // Store the correct default display - elemdisplay[ nodeName ] = display; - } - - return display; -} -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var documentElement = document.documentElement; - - - -( function() { - var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal, - reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - div.style.cssText = "float:left;opacity:.5"; - - // Support: IE<9 - // Make sure that element opacity exists (as opposed to filter) - support.opacity = div.style.opacity === "0.5"; - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - support.cssFloat = !!div.style.cssFloat; - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container = document.createElement( "div" ); - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - div.innerHTML = ""; - container.appendChild( div ); - - // Support: Firefox<29, Android 2.3 - // Vendor-prefix box-sizing - support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" || - div.style.WebkitBoxSizing === ""; - - jQuery.extend( support, { - reliableHiddenOffsets: function() { - if ( pixelPositionVal == null ) { - computeStyleTests(); - } - return reliableHiddenOffsetsVal; - }, - - boxSizingReliable: function() { - - // We're checking for pixelPositionVal here instead of boxSizingReliableVal - // since that compresses better and they're computed together anyway. - if ( pixelPositionVal == null ) { - computeStyleTests(); - } - return boxSizingReliableVal; - }, - - pixelMarginRight: function() { - - // Support: Android 4.0-4.3 - if ( pixelPositionVal == null ) { - computeStyleTests(); - } - return pixelMarginRightVal; - }, - - pixelPosition: function() { - if ( pixelPositionVal == null ) { - computeStyleTests(); - } - return pixelPositionVal; - }, - - reliableMarginRight: function() { - - // Support: Android 2.3 - if ( pixelPositionVal == null ) { - computeStyleTests(); - } - return reliableMarginRightVal; - }, - - reliableMarginLeft: function() { - - // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37 - if ( pixelPositionVal == null ) { - computeStyleTests(); - } - return reliableMarginLeftVal; - } - } ); - - function computeStyleTests() { - var contents, divStyle, - documentElement = document.documentElement; - - // Setup - documentElement.appendChild( container ); - - div.style.cssText = - - // Support: Android 2.3 - // Vendor-prefix box-sizing - "-webkit-box-sizing:border-box;box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - - // Support: IE<9 - // Assume reasonable values in the absence of getComputedStyle - pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false; - pixelMarginRightVal = reliableMarginRightVal = true; - - // Check for getComputedStyle so that this code is not run in IE<9. - if ( window.getComputedStyle ) { - divStyle = window.getComputedStyle( div ); - pixelPositionVal = ( divStyle || {} ).top !== "1%"; - reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px"; - boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px"; - - // Support: Android 2.3 only - // Div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container (#3333) - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - contents = div.appendChild( document.createElement( "div" ) ); - - // Reset CSS: box-sizing; display; margin; border; padding - contents.style.cssText = div.style.cssText = - - // Support: Android 2.3 - // Vendor-prefix box-sizing - "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + - "box-sizing:content-box;display:block;margin:0;border:0;padding:0"; - contents.style.marginRight = contents.style.width = "0"; - div.style.width = "1px"; - - reliableMarginRightVal = - !parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight ); - - div.removeChild( contents ); - } - - // Support: IE6-8 - // First check that getClientRects works as expected - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - div.style.display = "none"; - reliableHiddenOffsetsVal = div.getClientRects().length === 0; - if ( reliableHiddenOffsetsVal ) { - div.style.display = ""; - div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>"; - div.childNodes[ 0 ].style.borderCollapse = "separate"; - contents = div.getElementsByTagName( "td" ); - contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none"; - reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; - if ( reliableHiddenOffsetsVal ) { - contents[ 0 ].style.display = ""; - contents[ 1 ].style.display = "none"; - reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; - } - } - - // Teardown - documentElement.removeChild( container ); - } - -} )(); - - -var getStyles, curCSS, - rposition = /^(top|right|bottom|left)$/; - -if ( window.getComputedStyle ) { - getStyles = function( elem ) { - - // Support: IE<=11+, Firefox<=30+ (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - curCSS = function( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined; - - // Support: Opera 12.1x only - // Fall back to style even without computed - // computed is undefined for elems on document fragments - if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - if ( computed ) { - - // A tribute to the "awesome hack by Dean Edwards" - // Chrome < 17 and Safari 5.0 uses "computed value" - // instead of "used value" for margin-right - // Safari 5.1.7 (at least) returns percentage for a larger set of values, - // but width seems to be reliably pixels - // this is against the CSSOM draft spec: - // http://dev.w3.org/csswg/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - // Support: IE - // IE returns zIndex value as an integer. - return ret === undefined ? - ret : - ret + ""; - }; -} else if ( documentElement.currentStyle ) { - getStyles = function( elem ) { - return elem.currentStyle; - }; - - curCSS = function( elem, name, computed ) { - var left, rs, rsLeft, ret, - style = elem.style; - - computed = computed || getStyles( elem ); - ret = computed ? computed[ name ] : undefined; - - // Avoid setting ret to empty string here - // so we don't default to auto - if ( ret == null && style && style[ name ] ) { - ret = style[ name ]; - } - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - // but not position css attributes, as those are - // proportional to the parent element instead - // and we can't measure the parent instead because it - // might trigger a "stacking dolls" problem - if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { - - // Remember the original values - left = style.left; - rs = elem.runtimeStyle; - rsLeft = rs && rs.left; - - // Put in the new values to get a computed value out - if ( rsLeft ) { - rs.left = elem.currentStyle.left; - } - style.left = name === "fontSize" ? "1em" : ret; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - if ( rsLeft ) { - rs.left = rsLeft; - } - } - - // Support: IE - // IE returns zIndex value as an integer. - return ret === undefined ? - ret : - ret + "" || "auto"; - }; -} - - - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - ralpha = /alpha\([^)]*\)/i, - ropacity = /opacity\s*=\s*([^)]*)/i, - - // swappable if display is none or starts with table except - // "table", "table-cell", or "table-caption" - // see here for display values: - // https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ), - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = jQuery._data( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = - jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) ); - } - } else { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - jQuery._data( - elem, - "olddisplay", - hidden ? display : jQuery.css( elem, "display" ) - ); - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - - // If we already have the right measurement, avoid augmentation - 4 : - - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = support.boxSizing && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - - // normalize float css property - "float": support.cssFloat ? "cssFloat" : "styleFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set. See: #7116 - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, - // but it would mean to define eight - // (for every problematic property) identical functions - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - // Support: IE - // Swallow errors from 'invalid' CSS values (#5509) - try { - style[ name ] = value; - } catch ( e ) {} - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var num, val, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // certain elements can have dimension info if we invisibly show them - // however, it must have a current display style that would benefit from this - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - elem.offsetWidth === 0 ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var styles = extra && getStyles( elem ); - return setPositiveNumber( elem, value, extra ? - augmentWidthOrHeight( - elem, - name, - extra, - support.boxSizing && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ) : 0 - ); - } - }; -} ); - -if ( !support.opacity ) { - jQuery.cssHooks.opacity = { - get: function( elem, computed ) { - - // IE uses filters for opacity - return ropacity.test( ( computed && elem.currentStyle ? - elem.currentStyle.filter : - elem.style.filter ) || "" ) ? - ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : - computed ? "1" : ""; - }, - - set: function( elem, value ) { - var style = elem.style, - currentStyle = elem.currentStyle, - opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", - filter = currentStyle && currentStyle.filter || style.filter || ""; - - // IE has trouble with opacity if it does not have layout - // Force it by setting the zoom level - style.zoom = 1; - - // if setting opacity to 1, and no other filters exist - - // attempt to remove filter attribute #6652 - // if value === "", then remove inline opacity #12685 - if ( ( value >= 1 || value === "" ) && - jQuery.trim( filter.replace( ralpha, "" ) ) === "" && - style.removeAttribute ) { - - // Setting style.filter to null, "" & " " still leave "filter:" in the cssText - // if "filter:" is present at all, clearType is disabled, we want to avoid this - // style.removeAttribute is IE Only, but so apparently is this code path... - style.removeAttribute( "filter" ); - - // if there is no filter style applied in a css rule - // or unset inline opacity, we are done - if ( value === "" || currentStyle && !currentStyle.filter ) { - return; - } - } - - // otherwise, set new filter values - style.filter = ralpha.test( filter ) ? - filter.replace( ralpha, opacity ) : - filter + " " + opacity; - } - }; -} - -jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight, - function( elem, computed ) { - if ( computed ) { - return swap( elem, { "display": "inline-block" }, - curCSS, [ elem, "marginRight" ] ); - } - } -); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( - parseFloat( curCSS( elem, "marginLeft" ) ) || - - // Support: IE<=11+ - // Running getBoundingClientRect on a disconnected node in IE throws an error - // Support: IE8 only - // getClientRects() errors on disconnected elems - ( jQuery.contains( elem.ownerDocument, elem ) ? - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) : - 0 - ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails - // so, simple values such as "10px" are parsed to Float. - // complex values such as "rotate(1rad)" are returned as is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // use step hook for back compat - use cssHook if its there - use .style if its - // available and use plain properties where available - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 -// Panic based approach to setting things on disconnected nodes - -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back Compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, timerId, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - attrs = { height: type }, - i = 0; - - // if we include width, step value is 1 to do all cssExpand values, - // if we don't include width, step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4 ; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // we're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - /* jshint validthis: true */ - var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHidden( elem ), - dataShow = jQuery._data( elem, "fxshow" ); - - // handle queue: false promises - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // doing this makes sure that the complete handler will be called - // before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // height/width overflow pass - if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { - - // Make sure that nothing sneaks out - // Record all 3 overflow attributes because IE does not - // change the overflow attribute when overflowX and - // overflowY are set to the same value - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Set display property to inline-block for height/width - // animations on inline elements that are having width/height animated - display = jQuery.css( elem, "display" ); - - // Test default display if display is currently "none" - checkDisplay = display === "none" ? - jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display; - - if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) { - - // inline-level elements accept inline-block; - // block-level elements need to be inline with layout - if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) { - style.display = "inline-block"; - } else { - style.zoom = 1; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - if ( !support.shrinkWrapBlocks() ) { - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - } - - // show/hide pass - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.exec( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // If there is dataShow left over from a stopped hide or show - // and we are going to proceed with show, we should pretend to be hidden - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - - // Any non-fx value stops us from restoring the original display value - } else { - display = undefined; - } - } - - if ( !jQuery.isEmptyObject( orig ) ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = jQuery._data( elem, "fxshow", {} ); - } - - // store state if its toggle - enables .stop().toggle() to "reverse" - if ( toggle ) { - dataShow.hidden = !hidden; - } - if ( hidden ) { - jQuery( elem ).show(); - } else { - anim.done( function() { - jQuery( elem ).hide(); - } ); - } - anim.done( function() { - var prop; - jQuery._removeData( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - for ( prop in orig ) { - tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = tween.start; - if ( hidden ) { - tween.end = tween.start; - tween.start = prop === "width" || prop === "height" ? 1 : 0; - } - } - } - - // If this is a noop like .hide().hide(), restore an overwritten display value - } else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) { - style.display = display; - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( jQuery.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // not quite $.extend, this wont overwrite keys already present. - // also - reusing 'index' from above because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length ; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - if ( percent < 1 && length ) { - return remaining; - } else { - deferred.resolveWith( elem, [ animation ] ); - return false; - } - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // if we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length ; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // resolve when we played the last frame - // otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length ; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - // attach callbacks from options - return animation.progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnotwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length ; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : - opt.duration in jQuery.fx.speeds ? - jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; - - // normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // show any hidden elements after setting opacity to 0 - return this.filter( isHidden ).css( "opacity", 0 ).show() - - // animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || jQuery._data( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = jQuery._data( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // start the next in the queue if the last step wasn't forced - // timers currently will call their complete callbacks, which will dequeue - // but only if they were gotoEnd - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = jQuery._data( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // enable finishing flag on private data - data.finish = true; - - // empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - timers = jQuery.timers, - i = 0; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Checks the timer has not already been removed - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - if ( timer() ) { - jQuery.fx.start(); - } else { - jQuery.timers.pop(); - } -}; - -jQuery.fx.interval = 13; - -jQuery.fx.start = function() { - if ( !timerId ) { - timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval ); - } -}; - -jQuery.fx.stop = function() { - window.clearInterval( timerId ); - timerId = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var a, - input = document.createElement( "input" ), - div = document.createElement( "div" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - // Setup - div = document.createElement( "div" ); - div.setAttribute( "className", "t" ); - div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Support: Windows Web Apps (WWA) - // `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "checkbox" ); - div.appendChild( input ); - - a = div.getElementsByTagName( "a" )[ 0 ]; - - // First batch of tests. - a.style.cssText = "top:1px"; - - // Test setAttribute on camelCase class. - // If it works, we need attrFixes when doing get/setAttribute (ie6/7) - support.getSetAttribute = div.className !== "t"; - - // Get the style information from getAttribute - // (IE uses .cssText instead) - support.style = /top/.test( a.getAttribute( "style" ) ); - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - support.hrefNormalized = a.getAttribute( "href" ) === "/a"; - - // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) - support.checkOn = !!input.value; - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - support.optSelected = opt.selected; - - // Tests for enctype support on a form (#6743) - support.enctype = !!document.createElement( "form" ).enctype; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Support: IE8 only - // Check if we can trust getAttribute("value") - input = document.createElement( "input" ); - input.setAttribute( "value", "" ); - support.input = input.getAttribute( "value" ) === ""; - - // Check if an input maintains its value after becoming a radio - input.value = "t"; - input.setAttribute( "type", "radio" ); - support.radioValue = input.value === "t"; -} )(); - - -var rreturn = /\r/g, - rspaces = /[\x20\t\r\n\f]+/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( - hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - - // handle most common string cases - ret.replace( rreturn, "" ) : - - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE10-11+ - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " ); - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // oldIE doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - ( support.optDisabled ? - !option.disabled : - option.getAttribute( "disabled" ) === null ) && - ( !option.parentNode.disabled || - !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { - - // Support: IE6 - // When new option element is added to select box we need to - // force reflow of newly added node in order to workaround delay - // of initialization properties - try { - option.selected = optionSet = true; - - } catch ( _ ) { - - // Will be executed only in IE6 - option.scrollHeight; - } - - } else { - option.selected = false; - } - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - - return options; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -var nodeHook, boolHook, - attrHandle = jQuery.expr.attrHandle, - ruseDefault = /^(?:checked|selected)$/i, - getSetAttribute = support.getSetAttribute, - getSetInput = support.input; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - jQuery.nodeName( elem, "input" ) ) { - - // Setting the type on a radio button after the value resets the value in IE8-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - - // Set corresponding property to false - if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - elem[ propName ] = false; - - // Support: IE<9 - // Also clear defaultChecked/defaultSelected (if appropriate) - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = - elem[ propName ] = false; - } - - // See #9699 for explanation of this approach (setting first, then removal) - } else { - jQuery.attr( elem, name, "" ); - } - - elem.removeAttribute( getSetAttribute ? name : propName ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - - // IE<8 needs the *property* name - elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); - - } else { - - // Support: IE<9 - // Use defaultChecked and defaultSelected for oldIE - elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle; - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ name ]; - attrHandle[ name ] = ret; - ret = getter( elem, name, isXML ) != null ? - name.toLowerCase() : - null; - attrHandle[ name ] = handle; - } - return ret; - }; - } else { - attrHandle[ name ] = function( elem, name, isXML ) { - if ( !isXML ) { - return elem[ jQuery.camelCase( "default-" + name ) ] ? - name.toLowerCase() : - null; - } - }; - } -} ); - -// fix oldIE attroperties -if ( !getSetInput || !getSetAttribute ) { - jQuery.attrHooks.value = { - set: function( elem, value, name ) { - if ( jQuery.nodeName( elem, "input" ) ) { - - // Does not return so that setAttribute is also used - elem.defaultValue = value; - } else { - - // Use nodeHook if defined (#1954); otherwise setAttribute is fine - return nodeHook && nodeHook.set( elem, value, name ); - } - } - }; -} - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = { - set: function( elem, value, name ) { - - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - elem.setAttributeNode( - ( ret = elem.ownerDocument.createAttribute( name ) ) - ); - } - - ret.value = value += ""; - - // Break association with cloned elements by also using setAttribute (#9646) - if ( name === "value" || value === elem.getAttribute( name ) ) { - return value; - } - } - }; - - // Some attributes are constructed with empty-string values when not defined - attrHandle.id = attrHandle.name = attrHandle.coords = - function( elem, name, isXML ) { - var ret; - if ( !isXML ) { - return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ? - ret.value : - null; - } - }; - - // Fixing value retrieval on a button requires this module - jQuery.valHooks.button = { - get: function( elem, name ) { - var ret = elem.getAttributeNode( name ); - if ( ret && ret.specified ) { - return ret.value; - } - }, - set: nodeHook.set - }; - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - set: function( elem, value, name ) { - nodeHook.set( elem, value === "" ? false : value, name ); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each( [ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }; - } ); -} - -if ( !support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - - // Return undefined in the case of empty string - // Note: IE uppercases css property names, but if we were to .toLowerCase() - // .cssText, that would destroy case sensitivity in URL's, like in "background" - return elem.style.cssText || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = value + "" ); - } - }; -} - - - - -var rfocusable = /^(?:input|select|textarea|button|object)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each( function() { - - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch ( e ) {} - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - return tabindex ? - parseInt( tabindex, 10 ) : - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && elem.href ? - 0 : - -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Some attributes require a special call on IE -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !support.hrefNormalized ) { - - // href/src property should get the full normalized URL (#10299/#12915) - jQuery.each( [ "href", "src" ], function( i, name ) { - jQuery.propHooks[ name ] = { - get: function( elem ) { - return elem.getAttribute( name, 4 ); - } - }; - } ); -} - -// Support: Safari, IE9+ -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - }, - set: function( elem ) { - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - -// IE6/7 call enctype encoding -if ( !support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - - - - -var rclass = /[\t\r\n\f]/g; - -function getClass( elem ) { - return jQuery.attr( elem, "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnotwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && - ( " " + curValue + " " ).replace( rclass, " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // only assign if different to avoid unneeded rendering. - finalValue = jQuery.trim( cur ); - if ( curValue !== finalValue ) { - jQuery.attr( elem, "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnotwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && - ( " " + curValue + " " ).replace( rclass, " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = jQuery.trim( cur ); - if ( curValue !== finalValue ) { - jQuery.attr( elem, "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnotwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // store className if set - jQuery._data( this, "__className__", className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - jQuery.attr( this, "class", - className || value === false ? - "" : - jQuery._data( this, "__className__" ) || "" - ); - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + getClass( elem ) + " " ).replace( rclass, " " ) - .indexOf( className ) > -1 - ) { - return true; - } - } - - return false; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g; - -jQuery.parseJSON = function( data ) { - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - - // Support: Android 2.3 - // Workaround failure to string-cast null input - return window.JSON.parse( data + "" ); - } - - var requireNonComma, - depth = null, - str = jQuery.trim( data + "" ); - - // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains - // after removing valid tokens - return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) { - - // Force termination if we see a misplaced comma - if ( requireNonComma && comma ) { - depth = 0; - } - - // Perform no more replacements after returning to outermost depth - if ( depth === 0 ) { - return token; - } - - // Commas must not follow "[", "{", or "," - requireNonComma = open || comma; - - // Determine new depth - // array/object open ("[" or "{"): depth += true - false (increment) - // array/object close ("]" or "}"): depth += false - true (decrement) - // other cases ("," or primitive): depth += true - true (numeric cast) - depth += !close - !open; - - // Remove this token - return ""; - } ) ) ? - ( Function( "return " + str ) )() : - jQuery.error( "Invalid JSON: " + data ); -}; - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - try { - if ( window.DOMParser ) { // Standard - tmp = new window.DOMParser(); - xml = tmp.parseFromString( data, "text/xml" ); - } else { // IE - xml = new window.ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch ( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rhash = /#.*$/, - rts = /([?&])_=[^&]*/, - - // IE leaves an \r character at EOL - rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Document location - ajaxLocation = location.href, - - // Segment location into parts - ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType.charAt( 0 ) === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var deep, key, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - var firstDataType, ct, finalDataType, type, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: ajaxLocation, - type: "GET", - isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": jQuery.parseJSON, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var - - // Cross-domain detection vars - parts, - - // Loop variable - i, - - // URL without anti-cache param - cacheURL, - - // Response headers as string - responseHeadersString, - - // timeout handle - timeoutTimer, - - // To know if global events are to be dispatched - fireGlobals, - - transport, - - // Response headers - responseHeaders, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // The jqXHR state - state = 0, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( state === 2 ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return state === 2 ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - var lname = name.toLowerCase(); - if ( !state ) { - name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( !state ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( state < 2 ) { - for ( code in map ) { - - // Lazy-add the new callback in a way that preserves old ones - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } else { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ).complete = completeDeferred.add; - jqXHR.success = jqXHR.done; - jqXHR.error = jqXHR.fail; - - // Remove hash character (#7531: and string promotion) - // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || ajaxLocation ) + "" ) - .replace( rhash, "" ) - .replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ]; - - // A cross-domain request is in order when we have a protocol:host:port mismatch - if ( s.crossDomain == null ) { - parts = rurl.exec( s.url.toLowerCase() ); - s.crossDomain = !!( parts && - ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || - ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== - ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) - ); - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( state === 2 ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - cacheURL = s.url; - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // If data is available, append data to url - if ( s.data ) { - cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add anti-cache in url if needed - if ( s.cache === false ) { - s.url = rts.test( cacheURL ) ? - - // If there is already a '_' parameter, set its value - cacheURL.replace( rts, "$1_=" + nonce++ ) : - - // Otherwise add one to the end - cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; - } - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - for ( i in { success: 1, error: 1, complete: 1 } ) { - jqXHR[ i ]( s[ i ] ); - } - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( state === 2 ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - state = 1; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Propagate exception as error if not done - if ( state < 2 ) { - done( -1, e ); - - // Simply rethrow otherwise - } else { - throw e; - } - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Called once - if ( state === 2 ) { - return; - } - - // State is "done" now - state = 2; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // We extract error from statusText - // then normalize statusText and status for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapAll( html.call( this, i ) ); - } ); - } - - if ( this[ 0 ] ) { - - // The elements to wrap the target around - var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { - elem = elem.firstChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function() { - return this.parent().each( function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - } ).end(); - } -} ); - - -function getDisplay( elem ) { - return elem.style && elem.style.display || jQuery.css( elem, "display" ); -} - -function filterHidden( elem ) { - - // Disconnected elements are considered hidden - if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) { - return true; - } - while ( elem && elem.nodeType === 1 ) { - if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) { - return true; - } - elem = elem.parentNode; - } - return false; -} - -jQuery.expr.filters.hidden = function( elem ) { - - // Support: Opera <= 12.12 - // Opera reports offsetWidths and offsetHeights less than zero on some elements - return support.reliableHiddenOffsets() ? - ( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 && - !elem.getClientRects().length ) : - filterHidden( elem ); -}; - -jQuery.expr.filters.visible = function( elem ) { - return !jQuery.expr.filters.hidden( elem ); -}; - - - - -var r20 = /%20/g, - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( jQuery.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, value ) { - - // If value is a function, invoke it and return its value - value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); - s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); - }; - - // Set traditional to true for jQuery <= 1.3.2 behavior. - if ( traditional === undefined ) { - traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ).replace( r20, "+" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is(":disabled") so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - return val == null ? - null : - jQuery.isArray( val ) ? - jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ) : - { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -// Create the request object -// (This is still attached to ajaxSettings for backward compatibility) -jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? - - // Support: IE6-IE8 - function() { - - // XHR cannot access local files, always use ActiveX for that case - if ( this.isLocal ) { - return createActiveXHR(); - } - - // Support: IE 9-11 - // IE seems to error on cross-domain PATCH requests when ActiveX XHR - // is used. In IE 9+ always use the native XHR. - // Note: this condition won't catch Edge as it doesn't define - // document.documentMode but it also doesn't support ActiveX so it won't - // reach this code. - if ( document.documentMode > 8 ) { - return createStandardXHR(); - } - - // Support: IE<9 - // oldIE XHR does not support non-RFC2616 methods (#13240) - // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx - // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9 - // Although this check for six methods instead of eight - // since IE also does not support "trace" and "connect" - return /^(get|post|head|put|delete|options)$/i.test( this.type ) && - createStandardXHR() || createActiveXHR(); - } : - - // For all other browsers, use the standard XMLHttpRequest object - createStandardXHR; - -var xhrId = 0, - xhrCallbacks = {}, - xhrSupported = jQuery.ajaxSettings.xhr(); - -// Support: IE<10 -// Open requests must be manually aborted on unload (#5280) -// See https://support.microsoft.com/kb/2856746 for more info -if ( window.attachEvent ) { - window.attachEvent( "onunload", function() { - for ( var key in xhrCallbacks ) { - xhrCallbacks[ key ]( undefined, true ); - } - } ); -} - -// Determine support properties -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -xhrSupported = support.ajax = !!xhrSupported; - -// Create transport if the browser can provide an xhr -if ( xhrSupported ) { - - jQuery.ajaxTransport( function( options ) { - - // Cross domain only allowed if supported through XMLHttpRequest - if ( !options.crossDomain || support.cors ) { - - var callback; - - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(), - id = ++xhrId; - - // Open the socket - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - - // Support: IE<9 - // IE's ActiveXObject throws a 'Type Mismatch' exception when setting - // request header to a null-value. - // - // To keep consistent with other XHR implementations, cast the value - // to string and ignore `undefined`. - if ( headers[ i ] !== undefined ) { - xhr.setRequestHeader( i, headers[ i ] + "" ); - } - } - - // Do send the request - // This may raise an exception which is actually - // handled in jQuery.ajax (so no try/catch here) - xhr.send( ( options.hasContent && options.data ) || null ); - - // Listener - callback = function( _, isAbort ) { - var status, statusText, responses; - - // Was never called and is aborted or complete - if ( callback && ( isAbort || xhr.readyState === 4 ) ) { - - // Clean up - delete xhrCallbacks[ id ]; - callback = undefined; - xhr.onreadystatechange = jQuery.noop; - - // Abort manually if needed - if ( isAbort ) { - if ( xhr.readyState !== 4 ) { - xhr.abort(); - } - } else { - responses = {}; - status = xhr.status; - - // Support: IE<10 - // Accessing binary-data responseText throws an exception - // (#11426) - if ( typeof xhr.responseText === "string" ) { - responses.text = xhr.responseText; - } - - // Firefox throws an exception when accessing - // statusText for faulty cross-domain requests - try { - statusText = xhr.statusText; - } catch ( e ) { - - // We normalize with Webkit giving an empty statusText - statusText = ""; - } - - // Filter status for non standard behaviors - - // If the request is local and we have data: assume a success - // (success with no data won't get notified, that's the best we - // can do given current implementations) - if ( !status && options.isLocal && !options.crossDomain ) { - status = responses.text ? 200 : 404; - - // IE - #1450: sometimes returns 1223 when it should be 204 - } else if ( status === 1223 ) { - status = 204; - } - } - } - - // Call complete if needed - if ( responses ) { - complete( status, statusText, responses, xhr.getAllResponseHeaders() ); - } - }; - - // Do send the request - // `xhr.send` may raise an exception, but it will be - // handled in jQuery.ajax (so no try/catch here) - if ( !options.async ) { - - // If we're in sync mode we fire the callback - callback(); - } else if ( xhr.readyState === 4 ) { - - // (IE6 & IE7) if it's in cache and has been - // retrieved directly we need to fire the callback - window.setTimeout( callback ); - } else { - - // Register the callback, but delay it in case `xhr.send` throws - // Add to the list of active xhr callbacks - xhr.onreadystatechange = xhrCallbacks[ id ] = callback; - } - }, - - abort: function() { - if ( callback ) { - callback( undefined, true ); - } - } - }; - } - } ); -} - -// Functions to create xhrs -function createStandardXHR() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -} - -function createActiveXHR() { - try { - return new window.ActiveXObject( "Microsoft.XMLHTTP" ); - } catch ( e ) {} -} - - - - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and global -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - s.global = false; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - - var script, - head = document.head || jQuery( "head" )[ 0 ] || document.documentElement; - - return { - - send: function( _, callback ) { - - script = document.createElement( "script" ); - - script.async = true; - - if ( s.scriptCharset ) { - script.charset = s.scriptCharset; - } - - script.src = s.url; - - // Attach handlers for all browsers - script.onload = script.onreadystatechange = function( _, isAbort ) { - - if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { - - // Handle memory leak in IE - script.onload = script.onreadystatechange = null; - - // Remove the script - if ( script.parentNode ) { - script.parentNode.removeChild( script ); - } - - // Dereference the script - script = null; - - // Callback if not abort - if ( !isAbort ) { - callback( 200, "success" ); - } - } - }; - - // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending - // Use native DOM manipulation to avoid our domManip AJAX trickery - head.insertBefore( script, head.firstChild ); - }, - - abort: function() { - if ( script ) { - script.onload( undefined, true ); - } - } - }; - } -} ); - - - - -var oldCallbacks = [], - rjsonp = /(=)\?(?=&|$)|\?\?/; - -// Default jsonp settings -jQuery.ajaxSetup( { - jsonp: "callback", - jsonpCallback: function() { - var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); - this[ callback ] = true; - return callback; - } -} ); - -// Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - - var callbackName, overwritten, responseContainer, - jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? - "url" : - typeof s.data === "string" && - ( s.contentType || "" ) - .indexOf( "application/x-www-form-urlencoded" ) === 0 && - rjsonp.test( s.data ) && "data" - ); - - // Handle iff the expected data type is "jsonp" or we have a parameter to set - if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { - - // Get callback name, remembering preexisting value associated with it - callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? - s.jsonpCallback() : - s.jsonpCallback; - - // Insert callback into url or form data - if ( jsonProp ) { - s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); - } else if ( s.jsonp !== false ) { - s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; - } - - // Use data converter to retrieve json after script execution - s.converters[ "script json" ] = function() { - if ( !responseContainer ) { - jQuery.error( callbackName + " was not called" ); - } - return responseContainer[ 0 ]; - }; - - // force json dataType - s.dataTypes[ 0 ] = "json"; - - // Install callback - overwritten = window[ callbackName ]; - window[ callbackName ] = function() { - responseContainer = arguments; - }; - - // Clean-up function (fires after converters) - jqXHR.always( function() { - - // If previous value didn't exist - remove it - if ( overwritten === undefined ) { - jQuery( window ).removeProp( callbackName ); - - // Otherwise restore preexisting value - } else { - window[ callbackName ] = overwritten; - } - - // Save back as free - if ( s[ callbackName ] ) { - - // make sure that re-using the options doesn't screw things around - s.jsonpCallback = originalSettings.jsonpCallback; - - // save the callback name for future use - oldCallbacks.push( callbackName ); - } - - // Call if it was a function and we have a response - if ( responseContainer && jQuery.isFunction( overwritten ) ) { - overwritten( responseContainer[ 0 ] ); - } - - responseContainer = overwritten = undefined; - } ); - - // Delegate to script - return "script"; - } -} ); - - - - -// data: string of html -// context (optional): If specified, the fragment will be created in this context, -// defaults to document -// keepScripts (optional): If true, will include scripts passed in the html string -jQuery.parseHTML = function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[ 1 ] ) ]; - } - - parsed = buildFragment( [ data ], context, scripts ); - - if ( scripts && scripts.length ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); -}; - - -// Keep a copy of the old load method -var _load = jQuery.fn.load; - -/** - * Load a url into a page - */ -jQuery.fn.load = function( url, params, callback ) { - if ( typeof url !== "string" && _load ) { - return _load.apply( this, arguments ); - } - - var selector, type, response, - self = this, - off = url.indexOf( " " ); - - if ( off > -1 ) { - selector = jQuery.trim( url.slice( off, url.length ) ); - url = url.slice( 0, off ); - } - - // If it's a function - if ( jQuery.isFunction( params ) ) { - - // We assume that it's the callback - callback = params; - params = undefined; - - // Otherwise, build a param string - } else if ( params && typeof params === "object" ) { - type = "POST"; - } - - // If we have elements to modify, make the request - if ( self.length > 0 ) { - jQuery.ajax( { - url: url, - - // If "type" variable is undefined, then "GET" method will be used. - // Make value of this field explicit since - // user can override it through ajaxSetup method - type: type || "GET", - dataType: "html", - data: params - } ).done( function( responseText ) { - - // Save response for use in complete callback - response = arguments; - - self.html( selector ? - - // If a selector was specified, locate the right elements in a dummy div - // Exclude scripts to avoid IE 'Permission Denied' errors - jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : - - // Otherwise use the full result - responseText ); - - // If the request succeeds, this function gets "data", "status", "jqXHR" - // but they are ignored because response was set above. - // If it fails, this function gets "jqXHR", "status", "error" - } ).always( callback && function( jqXHR, status ) { - self.each( function() { - callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); - } ); - } ); - } - - return this; -}; - - - - -// Attach a bunch of functions for handling common AJAX events -jQuery.each( [ - "ajaxStart", - "ajaxStop", - "ajaxComplete", - "ajaxError", - "ajaxSuccess", - "ajaxSend" -], function( i, type ) { - jQuery.fn[ type ] = function( fn ) { - return this.on( type, fn ); - }; -} ); - - - - -jQuery.expr.filters.animated = function( elem ) { - return jQuery.grep( jQuery.timers, function( fn ) { - return elem === fn.elem; - } ).length; -}; - - - - - -/** - * Gets a window from an element - */ -function getWindow( elem ) { - return jQuery.isWindow( elem ) ? - elem : - elem.nodeType === 9 ? - elem.defaultView || elem.parentWindow : - false; -} - -jQuery.offset = { - setOffset: function( elem, options, i ) { - var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, - position = jQuery.css( elem, "position" ), - curElem = jQuery( elem ), - props = {}; - - // set position first, in-case top/left are set even on static elem - if ( position === "static" ) { - elem.style.position = "relative"; - } - - curOffset = curElem.offset(); - curCSSTop = jQuery.css( elem, "top" ); - curCSSLeft = jQuery.css( elem, "left" ); - calculatePosition = ( position === "absolute" || position === "fixed" ) && - jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1; - - // need to be able to calculate position if either top or left - // is auto and position is either absolute or fixed - if ( calculatePosition ) { - curPosition = curElem.position(); - curTop = curPosition.top; - curLeft = curPosition.left; - } else { - curTop = parseFloat( curCSSTop ) || 0; - curLeft = parseFloat( curCSSLeft ) || 0; - } - - if ( jQuery.isFunction( options ) ) { - - // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) - options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); - } - - if ( options.top != null ) { - props.top = ( options.top - curOffset.top ) + curTop; - } - if ( options.left != null ) { - props.left = ( options.left - curOffset.left ) + curLeft; - } - - if ( "using" in options ) { - options.using.call( elem, props ); - } else { - curElem.css( props ); - } - } -}; - -jQuery.fn.extend( { - offset: function( options ) { - if ( arguments.length ) { - return options === undefined ? - this : - this.each( function( i ) { - jQuery.offset.setOffset( this, options, i ); - } ); - } - - var docElem, win, - box = { top: 0, left: 0 }, - elem = this[ 0 ], - doc = elem && elem.ownerDocument; - - if ( !doc ) { - return; - } - - docElem = doc.documentElement; - - // Make sure it's not a disconnected DOM node - if ( !jQuery.contains( docElem, elem ) ) { - return box; - } - - // If we don't have gBCR, just use 0,0 rather than error - // BlackBerry 5, iOS 3 (original iPhone) - if ( typeof elem.getBoundingClientRect !== "undefined" ) { - box = elem.getBoundingClientRect(); - } - win = getWindow( doc ); - return { - top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ), - left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 ) - }; - }, - - position: function() { - if ( !this[ 0 ] ) { - return; - } - - var offsetParent, offset, - parentOffset = { top: 0, left: 0 }, - elem = this[ 0 ]; - - // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, - // because it is its only offset parent - if ( jQuery.css( elem, "position" ) === "fixed" ) { - - // we assume that getBoundingClientRect is available when computed position is fixed - offset = elem.getBoundingClientRect(); - } else { - - // Get *real* offsetParent - offsetParent = this.offsetParent(); - - // Get correct offsets - offset = this.offset(); - if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { - parentOffset = offsetParent.offset(); - } - - // Add offsetParent borders - parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); - parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); - } - - // Subtract parent offsets and element margins - // note: when an element has margin: auto the offsetLeft and marginLeft - // are the same in Safari causing offset.left to incorrectly be 0 - return { - top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), - left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) - }; - }, - - offsetParent: function() { - return this.map( function() { - var offsetParent = this.offsetParent; - - while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && - jQuery.css( offsetParent, "position" ) === "static" ) ) { - offsetParent = offsetParent.offsetParent; - } - return offsetParent || documentElement; - } ); - } -} ); - -// Create scrollLeft and scrollTop methods -jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { - var top = /Y/.test( prop ); - - jQuery.fn[ method ] = function( val ) { - return access( this, function( elem, method, val ) { - var win = getWindow( elem ); - - if ( val === undefined ) { - return win ? ( prop in win ) ? win[ prop ] : - win.document.documentElement[ method ] : - elem[ method ]; - } - - if ( win ) { - win.scrollTo( - !top ? val : jQuery( win ).scrollLeft(), - top ? val : jQuery( win ).scrollTop() - ); - - } else { - elem[ method ] = val; - } - }, method, val, arguments.length, null ); - }; -} ); - -// Support: Safari<7-8+, Chrome<37-44+ -// Add the top/left cssHooks using jQuery.fn.position -// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 -// getComputedStyle returns percent when specified for top/left/bottom/right -// rather than make the css module depend on the offset module, we just check for it here -jQuery.each( [ "top", "left" ], function( i, prop ) { - jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, - function( elem, computed ) { - if ( computed ) { - computed = curCSS( elem, prop ); - - // if curCSS returns percentage, fallback to offset - return rnumnonpx.test( computed ) ? - jQuery( elem ).position()[ prop ] + "px" : - computed; - } - } - ); -} ); - - -// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods -jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, - function( defaultExtra, funcName ) { - - // margin is only for outerHeight, outerWidth - jQuery.fn[ funcName ] = function( margin, value ) { - var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), - extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); - - return access( this, function( elem, type, value ) { - var doc; - - if ( jQuery.isWindow( elem ) ) { - - // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there - // isn't a whole lot we can do. See pull request at this URL for discussion: - // https://github.com/jquery/jquery/pull/764 - return elem.document.documentElement[ "client" + name ]; - } - - // Get document width or height - if ( elem.nodeType === 9 ) { - doc = elem.documentElement; - - // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], - // whichever is greatest - // unfortunately, this causes bug #3838 in IE6/8 only, - // but there is currently no good, small way to fix it. - return Math.max( - elem.body[ "scroll" + name ], doc[ "scroll" + name ], - elem.body[ "offset" + name ], doc[ "offset" + name ], - doc[ "client" + name ] - ); - } - - return value === undefined ? - - // Get width or height on the element, requesting but not forcing parseFloat - jQuery.css( elem, type, extra ) : - - // Set width or height on the element - jQuery.style( elem, type, value, extra ); - }, type, chainable ? margin : undefined, chainable, null ); - }; - } ); -} ); - - -jQuery.fn.extend( { - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length === 1 ? - this.off( selector, "**" ) : - this.off( types, selector || "**", fn ); - } -} ); - -// The number of elements contained in the matched element set -jQuery.fn.size = function() { - return this.length; -}; - -jQuery.fn.andSelf = jQuery.fn.addBack; - - - - -// Register as a named AMD module, since jQuery can be concatenated with other -// files that may use define, but not via a proper concatenation script that -// understands anonymous AMD modules. A named AMD is safest and most robust -// way to register. Lowercase jquery is used because AMD module names are -// derived from file names, and jQuery is normally delivered in a lowercase -// file name. Do this after creating the global so that if an AMD module wants -// to call noConflict to hide this version of jQuery, it will work. - -// Note that for maximum portability, libraries that are not jQuery should -// declare themselves as anonymous modules, and avoid setting a global if an -// AMD loader is present. jQuery is a special case. For more information, see -// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon - -if ( typeof define === "function" && define.amd ) { - define( "jquery", [], function() { - return jQuery; - } ); -} - - - -var - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$; - -jQuery.noConflict = function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; -}; - -// Expose jQuery and $ identifiers, even in -// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (#13566) -if ( !noGlobal ) { - window.jQuery = window.$ = jQuery; -} - -return jQuery; -})); diff --git a/public/admin/static/plugin/jQuery/1.12.4/jquery.min.js b/public/admin/static/plugin/jQuery/1.12.4/jquery.min.js deleted file mode 100644 index e836475..0000000 --- a/public/admin/static/plugin/jQuery/1.12.4/jquery.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; -}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{ -marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({ -padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n}); diff --git a/public/admin/static/plugin/jQuery/2.2.4/jquery.js b/public/admin/static/plugin/jQuery/2.2.4/jquery.js deleted file mode 100644 index 5c3c456..0000000 --- a/public/admin/static/plugin/jQuery/2.2.4/jquery.js +++ /dev/null @@ -1,9814 +0,0 @@ -/*! - * jQuery JavaScript Library v2.2.4 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-05-20T17:23Z - */ - -(function( global, factory ) { - - if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Support: Firefox 18+ -// Can't be in strict mode, several libs including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -//"use strict"; -var arr = []; - -var document = window.document; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var support = {}; - - - -var - version = "2.2.4", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android<4.1 - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - var realStringObj = obj && obj.toString(); - return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; - }, - - isPlainObject: function( obj ) { - var key; - - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call( obj, "constructor" ) && - !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android<4.0, iOS<6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf( "use strict" ) === 1 ) { - script = document.createElement( "script" ); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE9-11+ - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android<4.1 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -// JSHint would error on this code due to the Symbol not being defined in ES5. -// Defining this global in .jshintrc would create a danger of using the global -// unguarded in another place, it seems safer to just disable JSHint for these -// three lines. -/* jshint ignore: start */ -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} -/* jshint ignore: end */ - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: iOS 8.2 (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.2.1 - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2015-10-17 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, nidselect, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; - while ( i-- ) { - groups[i] = nidselect + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( (parent = document.defaultView) && parent.top !== parent ) { - // Support: IE 11 - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( document.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - return m ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" + - "<select id='" + expando + "-\r\\' msallowcapture=''>" + - "<option selected=''></option></select>"; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( (oldCache = uniqueCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = "<a href='#'></a>"; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = "<input/>"; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - } ); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - // Support: Blackberry 4.6 - // gEBID returns nodes no longer in the document (#6963) - if ( elem && elem.parentNode ) { - - // Inject the element directly into the jQuery object - this.length = 1; - this[ 0 ] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( pos ? - pos.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnotwhite = ( /\S+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], - [ "notify", "progress", jQuery.Callbacks( "memory" ) ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this === promise ? newDefer.promise() : this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( function() { - - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || - ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. - // If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // Add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .progress( updateFunc( i, progressContexts, progressValues ) ) - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ); - } else { - --remaining; - } - } - } - - // If we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -} ); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -} ); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called - // after the browser event has already occurred. - // Support: IE9-10 only - // Older IE sometimes signals "interactive" too soon - if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - register: function( owner, initial ) { - var value = initial || {}; - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable, non-writable property - // configurability must be true to allow the property to be - // deleted with the delete operator - } else { - Object.defineProperty( owner, this.expando, { - value: value, - writable: true, - configurable: true - } ); - } - return owner[ this.expando ]; - }, - cache: function( owner ) { - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( !acceptData( owner ) ) { - return {}; - } - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - owner[ this.expando ] && owner[ this.expando ][ key ]; - }, - access: function( owner, key, value ) { - var stored; - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase( key ) ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key === undefined ) { - this.register( owner ); - - } else { - - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <= 35-45+ - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://code.google.com/p/chromium/issues/detail?id=378607 - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data, camelKey; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // with the key as-is - data = dataUser.get( elem, key ) || - - // Try to find dashed key if it exists (gh-2779) - // This is for 2.2.x only - dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); - - if ( data !== undefined ) { - return data; - } - - camelKey = jQuery.camelCase( key ); - - // Attempt to get data from the cache - // with the key camelized - data = dataUser.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - camelKey = jQuery.camelCase( key ); - this.each( function() { - - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = dataUser.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - dataUser.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf( "-" ) > -1 && data !== undefined ) { - dataUser.set( this, key, value ); - } - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || - !jQuery.contains( elem.ownerDocument, elem ); - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { return tween.cur(); } : - function() { return jQuery.css( elem, prop, "" ); }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([\w:-]+)/ ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE9 - option: [ 1, "<select multiple='multiple'>", "</select>" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting <tbody> or other required elements. - thead: [ 1, "<table>", "</table>" ], - col: [ 2, "<table><colgroup>", "</colgroup></table>" ], - tr: [ 2, "<table><tbody>", "</tbody></table>" ], - td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE9-11+ - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== "undefined" ? - context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0-4.3, Safari<=5.1 - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari<=5.1, Android<4.2 - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<=11+ - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = "<textarea>x</textarea>"; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE9 -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Support (at least): Chrome, IE9 - // Find delegate handlers - // Black-hole SVG <use> instance trees (#13180) - // - // Support: Firefox<=42+ - // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) - if ( delegateCount && cur.nodeType && - ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push( { elem: cur, handlers: matches } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + - "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split( " " ), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + - "screenX screenY toElement" ).split( " " ), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + - ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + - ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome<28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android<4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://code.google.com/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, - - // Support: IE 10-11, Edge 10240+ - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /<script|<style|<link/i, - - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; - -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName( "tbody" )[ 0 ] || - elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1></$2>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <= 35-45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <= 35-45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - - // Keep domManip exposed until 3.0 (gh-2225) - domManip: domManip, - - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); - - -var iframe, - elemdisplay = { - - // Support: Firefox - // We have to pre-define these values for FF (#10227) - HTML: "block", - BODY: "block" - }; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ - -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - display = jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) ) - .appendTo( doc.documentElement ); - - // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse - doc = iframe[ 0 ].contentDocument; - - // Support: IE - doc.write(); - doc.close(); - - display = actualDisplay( nodeName, doc ); - iframe.detach(); - } - - // Store the correct default display - elemdisplay[ nodeName ] = display; - } - - return display; -} -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE<=11+, Firefox<=30+ (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var documentElement = document.documentElement; - - - -( function() { - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE9-11+ - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - div.style.cssText = - - // Support: Firefox<29, Android 2.3 - // Vendor-prefix box-sizing - "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - } - - jQuery.extend( support, { - pixelPosition: function() { - - // This test is executed only once but we still do memoizing - // since we can use the boxSizingReliable pre-computing. - // No need to check if the test was already performed, though. - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - if ( boxSizingReliableVal == null ) { - computeStyleTests(); - } - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - - // Support: Android 4.0-4.3 - // We're checking for boxSizingReliableVal here instead of pixelMarginRightVal - // since that compresses better and they're computed together anyway. - if ( boxSizingReliableVal == null ) { - computeStyleTests(); - } - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - - // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37 - if ( boxSizingReliableVal == null ) { - computeStyleTests(); - } - return reliableMarginLeftVal; - }, - reliableMarginRight: function() { - - // Support: Android 2.3 - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - // This support function is only executed once so no memoizing is needed. - var ret, - marginDiv = div.appendChild( document.createElement( "div" ) ); - - // Reset CSS: box-sizing; display; margin; border; padding - marginDiv.style.cssText = div.style.cssText = - - // Support: Android 2.3 - // Vendor-prefix box-sizing - "-webkit-box-sizing:content-box;box-sizing:content-box;" + - "display:block;margin:0;border:0;padding:0"; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - documentElement.appendChild( container ); - - ret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight ); - - documentElement.removeChild( container ); - div.removeChild( marginDiv ); - - return ret; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - style = elem.style; - - computed = computed || getStyles( elem ); - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined; - - // Support: Opera 12.1x only - // Fall back to style even without computed - // computed is undefined for elems on document fragments - if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // Support: IE9 - // getPropertyValue is only needed for .css('filter') (#12537) - if ( computed ) { - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // http://dev.w3.org/csswg/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE9-11+ - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - - // If we already have the right measurement, avoid augmentation - 4 : - - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = dataPriv.get( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = dataPriv.access( - elem, - "olddisplay", - defaultDisplay( elem.nodeName ) - ); - } - } else { - hidden = isHidden( elem ); - - if ( display !== "none" || !hidden ) { - dataPriv.set( - elem, - "olddisplay", - hidden ? display : jQuery.css( elem, "display" ) - ); - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // Support: IE9-11+ - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - style[ name ] = value; - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - elem.offsetWidth === 0 ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// Support: Android 2.3 -jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight, - function( elem, computed ) { - if ( computed ) { - return swap( elem, { "display": "inline-block" }, - curCSS, [ elem, "marginRight" ] ); - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE9 -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back Compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, timerId, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4 ; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - /* jshint validthis: true */ - var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHidden( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Handle queue: false promises - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Height/width overflow pass - if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { - - // Make sure that nothing sneaks out - // Record all 3 overflow attributes because IE9-10 do not - // change the overflow attribute when overflowX and - // overflowY are set to the same value - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Set display property to inline-block for height/width - // animations on inline elements that are having width/height animated - display = jQuery.css( elem, "display" ); - - // Test default display if display is currently "none" - checkDisplay = display === "none" ? - dataPriv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display; - - if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) { - style.display = "inline-block"; - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // show/hide pass - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.exec( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // If there is dataShow left over from a stopped hide or show - // and we are going to proceed with show, we should pretend to be hidden - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - - // Any non-fx value stops us from restoring the original display value - } else { - display = undefined; - } - } - - if ( !jQuery.isEmptyObject( orig ) ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", {} ); - } - - // Store state if its toggle - enables .stop().toggle() to "reverse" - if ( toggle ) { - dataShow.hidden = !hidden; - } - if ( hidden ) { - jQuery( elem ).show(); - } else { - anim.done( function() { - jQuery( elem ).hide(); - } ); - } - anim.done( function() { - var prop; - - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - for ( prop in orig ) { - tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = tween.start; - if ( hidden ) { - tween.end = tween.start; - tween.start = prop === "width" || prop === "height" ? 1 : 0; - } - } - } - - // If this is a noop like .hide().hide(), restore an overwritten display value - } else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) { - style.display = display; - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( jQuery.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length ; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - if ( percent < 1 && length ) { - return remaining; - } else { - deferred.resolveWith( elem, [ animation ] ); - return false; - } - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length ; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length ; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - // attach callbacks from options - return animation.progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); -} - -jQuery.Animation = jQuery.extend( Animation, { - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnotwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length ; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? - opt.duration : opt.duration in jQuery.fx.speeds ? - jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHidden ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Checks the timer has not already been removed - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - if ( timer() ) { - jQuery.fx.start(); - } else { - jQuery.timers.pop(); - } -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( !timerId ) { - timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval ); - } -}; - -jQuery.fx.stop = function() { - window.clearInterval( timerId ); - - timerId = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: iOS<=5.1, Android<=4.2+ - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE<=11+ - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: Android<=2.3 - // Options inside disabled selects are incorrectly marked as disabled - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Support: IE<=11+ - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - jQuery.nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - - // Set corresponding property to false - elem[ propName ] = false; - } - - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle; - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ name ]; - attrHandle[ name ] = ret; - ret = getter( elem, name, isXML ) != null ? - name.toLowerCase() : - null; - attrHandle[ name ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - return tabindex ? - parseInt( tabindex, 10 ) : - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && elem.href ? - 0 : - -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - -var rclass = /[\t\r\n\f]/g; - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnotwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && - ( " " + curValue + " " ).replace( rclass, " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = jQuery.trim( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnotwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && - ( " " + curValue + " " ).replace( rclass, " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = jQuery.trim( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnotwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + getClass( elem ) + " " ).replace( rclass, " " ) - .indexOf( className ) > -1 - ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g, - rspaces = /[\x20\t\r\n\f]+/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - - // Handle most common string cases - ret.replace( rreturn, "" ) : - - // Handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE10-11+ - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " ); - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - ( support.optDisabled ? - !option.disabled : option.getAttribute( "disabled" ) === null ) && - ( !option.parentNode.disabled || - !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - -// Support: Firefox -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome, Safari -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -// Support: Android 2.3 -// Workaround failure to string-cast null input -jQuery.parseJSON = function( data ) { - return JSON.parse( data + "" ); -}; - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE9 - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rhash = /#.*$/, - rts = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": jQuery.parseJSON, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // The jqXHR state - state = 0, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( state === 2 ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return state === 2 ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - var lname = name.toLowerCase(); - if ( !state ) { - name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( !state ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( state < 2 ) { - for ( code in map ) { - - // Lazy-add the new callback in a way that preserves old ones - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } else { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ).complete = completeDeferred.add; - jqXHR.success = jqXHR.done; - jqXHR.error = jqXHR.fail; - - // Remove hash character (#7531: and string promotion) - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE8-11+ - // IE throws exception if url is malformed, e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE8-11+ - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( state === 2 ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - cacheURL = s.url; - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // If data is available, append data to url - if ( s.data ) { - cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add anti-cache in url if needed - if ( s.cache === false ) { - s.url = rts.test( cacheURL ) ? - - // If there is already a '_' parameter, set its value - cacheURL.replace( rts, "$1_=" + nonce++ ) : - - // Otherwise add one to the end - cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; - } - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - for ( i in { success: 1, error: 1, complete: 1 } ) { - jqXHR[ i ]( s[ i ] ); - } - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( state === 2 ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - state = 1; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Propagate exception as error if not done - if ( state < 2 ) { - done( -1, e ); - - // Simply rethrow otherwise - } else { - throw e; - } - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Called once - if ( state === 2 ) { - return; - } - - // State is "done" now - state = 2; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapAll( html.call( this, i ) ); - } ); - } - - if ( this[ 0 ] ) { - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function() { - return this.parent().each( function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - } ).end(); - } -} ); - - -jQuery.expr.filters.hidden = function( elem ) { - return !jQuery.expr.filters.visible( elem ); -}; -jQuery.expr.filters.visible = function( elem ) { - - // Support: Opera <= 12.12 - // Opera reports offsetWidths and offsetHeights less than zero on some elements - // Use OR instead of AND as the element is not visible if either is true - // See tickets #10406 and #13132 - return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0; -}; - - - - -var r20 = /%20/g, - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( jQuery.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, value ) { - - // If value is a function, invoke it and return its value - value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); - s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); - }; - - // Set traditional to true for jQuery <= 1.3.2 behavior. - if ( traditional === undefined ) { - traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ).replace( r20, "+" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - return val == null ? - null : - jQuery.isArray( val ) ? - jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ) : - { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE9 - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE9 - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE9 - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "<script>" ).prop( { - charset: s.scriptCharset, - src: s.url - } ).on( - "load error", - callback = function( evt ) { - script.remove(); - callback = null; - if ( evt ) { - complete( evt.type === "error" ? 404 : 200, evt.type ); - } - } - ); - - // Use native DOM manipulation to avoid our domManip AJAX trickery - document.head.appendChild( script[ 0 ] ); - }, - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -var oldCallbacks = [], - rjsonp = /(=)\?(?=&|$)|\?\?/; - -// Default jsonp settings -jQuery.ajaxSetup( { - jsonp: "callback", - jsonpCallback: function() { - var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); - this[ callback ] = true; - return callback; - } -} ); - -// Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - - var callbackName, overwritten, responseContainer, - jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? - "url" : - typeof s.data === "string" && - ( s.contentType || "" ) - .indexOf( "application/x-www-form-urlencoded" ) === 0 && - rjsonp.test( s.data ) && "data" - ); - - // Handle iff the expected data type is "jsonp" or we have a parameter to set - if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { - - // Get callback name, remembering preexisting value associated with it - callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? - s.jsonpCallback() : - s.jsonpCallback; - - // Insert callback into url or form data - if ( jsonProp ) { - s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); - } else if ( s.jsonp !== false ) { - s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; - } - - // Use data converter to retrieve json after script execution - s.converters[ "script json" ] = function() { - if ( !responseContainer ) { - jQuery.error( callbackName + " was not called" ); - } - return responseContainer[ 0 ]; - }; - - // Force json dataType - s.dataTypes[ 0 ] = "json"; - - // Install callback - overwritten = window[ callbackName ]; - window[ callbackName ] = function() { - responseContainer = arguments; - }; - - // Clean-up function (fires after converters) - jqXHR.always( function() { - - // If previous value didn't exist - remove it - if ( overwritten === undefined ) { - jQuery( window ).removeProp( callbackName ); - - // Otherwise restore preexisting value - } else { - window[ callbackName ] = overwritten; - } - - // Save back as free - if ( s[ callbackName ] ) { - - // Make sure that re-using the options doesn't screw things around - s.jsonpCallback = originalSettings.jsonpCallback; - - // Save the callback name for future use - oldCallbacks.push( callbackName ); - } - - // Call if it was a function and we have a response - if ( responseContainer && jQuery.isFunction( overwritten ) ) { - overwritten( responseContainer[ 0 ] ); - } - - responseContainer = overwritten = undefined; - } ); - - // Delegate to script - return "script"; - } -} ); - - - - -// Argument "data" should be string of html -// context (optional): If specified, the fragment will be created in this context, -// defaults to document -// keepScripts (optional): If true, will include scripts passed in the html string -jQuery.parseHTML = function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[ 1 ] ) ]; - } - - parsed = buildFragment( [ data ], context, scripts ); - - if ( scripts && scripts.length ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); -}; - - -// Keep a copy of the old load method -var _load = jQuery.fn.load; - -/** - * Load a url into a page - */ -jQuery.fn.load = function( url, params, callback ) { - if ( typeof url !== "string" && _load ) { - return _load.apply( this, arguments ); - } - - var selector, type, response, - self = this, - off = url.indexOf( " " ); - - if ( off > -1 ) { - selector = jQuery.trim( url.slice( off ) ); - url = url.slice( 0, off ); - } - - // If it's a function - if ( jQuery.isFunction( params ) ) { - - // We assume that it's the callback - callback = params; - params = undefined; - - // Otherwise, build a param string - } else if ( params && typeof params === "object" ) { - type = "POST"; - } - - // If we have elements to modify, make the request - if ( self.length > 0 ) { - jQuery.ajax( { - url: url, - - // If "type" variable is undefined, then "GET" method will be used. - // Make value of this field explicit since - // user can override it through ajaxSetup method - type: type || "GET", - dataType: "html", - data: params - } ).done( function( responseText ) { - - // Save response for use in complete callback - response = arguments; - - self.html( selector ? - - // If a selector was specified, locate the right elements in a dummy div - // Exclude scripts to avoid IE 'Permission Denied' errors - jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : - - // Otherwise use the full result - responseText ); - - // If the request succeeds, this function gets "data", "status", "jqXHR" - // but they are ignored because response was set above. - // If it fails, this function gets "jqXHR", "status", "error" - } ).always( callback && function( jqXHR, status ) { - self.each( function() { - callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); - } ); - } ); - } - - return this; -}; - - - - -// Attach a bunch of functions for handling common AJAX events -jQuery.each( [ - "ajaxStart", - "ajaxStop", - "ajaxComplete", - "ajaxError", - "ajaxSuccess", - "ajaxSend" -], function( i, type ) { - jQuery.fn[ type ] = function( fn ) { - return this.on( type, fn ); - }; -} ); - - - - -jQuery.expr.filters.animated = function( elem ) { - return jQuery.grep( jQuery.timers, function( fn ) { - return elem === fn.elem; - } ).length; -}; - - - - -/** - * Gets a window from an element - */ -function getWindow( elem ) { - return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView; -} - -jQuery.offset = { - setOffset: function( elem, options, i ) { - var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, - position = jQuery.css( elem, "position" ), - curElem = jQuery( elem ), - props = {}; - - // Set position first, in-case top/left are set even on static elem - if ( position === "static" ) { - elem.style.position = "relative"; - } - - curOffset = curElem.offset(); - curCSSTop = jQuery.css( elem, "top" ); - curCSSLeft = jQuery.css( elem, "left" ); - calculatePosition = ( position === "absolute" || position === "fixed" ) && - ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; - - // Need to be able to calculate position if either - // top or left is auto and position is either absolute or fixed - if ( calculatePosition ) { - curPosition = curElem.position(); - curTop = curPosition.top; - curLeft = curPosition.left; - - } else { - curTop = parseFloat( curCSSTop ) || 0; - curLeft = parseFloat( curCSSLeft ) || 0; - } - - if ( jQuery.isFunction( options ) ) { - - // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) - options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); - } - - if ( options.top != null ) { - props.top = ( options.top - curOffset.top ) + curTop; - } - if ( options.left != null ) { - props.left = ( options.left - curOffset.left ) + curLeft; - } - - if ( "using" in options ) { - options.using.call( elem, props ); - - } else { - curElem.css( props ); - } - } -}; - -jQuery.fn.extend( { - offset: function( options ) { - if ( arguments.length ) { - return options === undefined ? - this : - this.each( function( i ) { - jQuery.offset.setOffset( this, options, i ); - } ); - } - - var docElem, win, - elem = this[ 0 ], - box = { top: 0, left: 0 }, - doc = elem && elem.ownerDocument; - - if ( !doc ) { - return; - } - - docElem = doc.documentElement; - - // Make sure it's not a disconnected DOM node - if ( !jQuery.contains( docElem, elem ) ) { - return box; - } - - box = elem.getBoundingClientRect(); - win = getWindow( doc ); - return { - top: box.top + win.pageYOffset - docElem.clientTop, - left: box.left + win.pageXOffset - docElem.clientLeft - }; - }, - - position: function() { - if ( !this[ 0 ] ) { - return; - } - - var offsetParent, offset, - elem = this[ 0 ], - parentOffset = { top: 0, left: 0 }; - - // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, - // because it is its only offset parent - if ( jQuery.css( elem, "position" ) === "fixed" ) { - - // Assume getBoundingClientRect is there when computed position is fixed - offset = elem.getBoundingClientRect(); - - } else { - - // Get *real* offsetParent - offsetParent = this.offsetParent(); - - // Get correct offsets - offset = this.offset(); - if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { - parentOffset = offsetParent.offset(); - } - - // Add offsetParent borders - parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); - parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); - } - - // Subtract parent offsets and element margins - return { - top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), - left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) - }; - }, - - // This method will return documentElement in the following cases: - // 1) For the element inside the iframe without offsetParent, this method will return - // documentElement of the parent window - // 2) For the hidden or detached element - // 3) For body or html element, i.e. in case of the html node - it will return itself - // - // but those exceptions were never presented as a real life use-cases - // and might be considered as more preferable results. - // - // This logic, however, is not guaranteed and can change at any point in the future - offsetParent: function() { - return this.map( function() { - var offsetParent = this.offsetParent; - - while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { - offsetParent = offsetParent.offsetParent; - } - - return offsetParent || documentElement; - } ); - } -} ); - -// Create scrollLeft and scrollTop methods -jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { - var top = "pageYOffset" === prop; - - jQuery.fn[ method ] = function( val ) { - return access( this, function( elem, method, val ) { - var win = getWindow( elem ); - - if ( val === undefined ) { - return win ? win[ prop ] : elem[ method ]; - } - - if ( win ) { - win.scrollTo( - !top ? val : win.pageXOffset, - top ? val : win.pageYOffset - ); - - } else { - elem[ method ] = val; - } - }, method, val, arguments.length ); - }; -} ); - -// Support: Safari<7-8+, Chrome<37-44+ -// Add the top/left cssHooks using jQuery.fn.position -// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 -// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280 -// getComputedStyle returns percent when specified for top/left/bottom/right; -// rather than make the css module depend on the offset module, just check for it here -jQuery.each( [ "top", "left" ], function( i, prop ) { - jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, - function( elem, computed ) { - if ( computed ) { - computed = curCSS( elem, prop ); - - // If curCSS returns percentage, fallback to offset - return rnumnonpx.test( computed ) ? - jQuery( elem ).position()[ prop ] + "px" : - computed; - } - } - ); -} ); - - -// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods -jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, - function( defaultExtra, funcName ) { - - // Margin is only for outerHeight, outerWidth - jQuery.fn[ funcName ] = function( margin, value ) { - var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), - extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); - - return access( this, function( elem, type, value ) { - var doc; - - if ( jQuery.isWindow( elem ) ) { - - // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there - // isn't a whole lot we can do. See pull request at this URL for discussion: - // https://github.com/jquery/jquery/pull/764 - return elem.document.documentElement[ "client" + name ]; - } - - // Get document width or height - if ( elem.nodeType === 9 ) { - doc = elem.documentElement; - - // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], - // whichever is greatest - return Math.max( - elem.body[ "scroll" + name ], doc[ "scroll" + name ], - elem.body[ "offset" + name ], doc[ "offset" + name ], - doc[ "client" + name ] - ); - } - - return value === undefined ? - - // Get width or height on the element, requesting but not forcing parseFloat - jQuery.css( elem, type, extra ) : - - // Set width or height on the element - jQuery.style( elem, type, value, extra ); - }, type, chainable ? margin : undefined, chainable, null ); - }; - } ); -} ); - - -jQuery.fn.extend( { - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length === 1 ? - this.off( selector, "**" ) : - this.off( types, selector || "**", fn ); - }, - size: function() { - return this.length; - } -} ); - -jQuery.fn.andSelf = jQuery.fn.addBack; - - - - -// Register as a named AMD module, since jQuery can be concatenated with other -// files that may use define, but not via a proper concatenation script that -// understands anonymous AMD modules. A named AMD is safest and most robust -// way to register. Lowercase jquery is used because AMD module names are -// derived from file names, and jQuery is normally delivered in a lowercase -// file name. Do this after creating the global so that if an AMD module wants -// to call noConflict to hide this version of jQuery, it will work. - -// Note that for maximum portability, libraries that are not jQuery should -// declare themselves as anonymous modules, and avoid setting a global if an -// AMD loader is present. jQuery is a special case. For more information, see -// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon - -if ( typeof define === "function" && define.amd ) { - define( "jquery", [], function() { - return jQuery; - } ); -} - - - -var - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$; - -jQuery.noConflict = function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; -}; - -// Expose jQuery and $ identifiers, even in AMD -// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (#13566) -if ( !noGlobal ) { - window.jQuery = window.$ = jQuery; -} - -return jQuery; -})); diff --git a/public/admin/static/plugin/jQuery/2.2.4/jquery.min.js b/public/admin/static/plugin/jQuery/2.2.4/jquery.min.js deleted file mode 100644 index 4024b66..0000000 --- a/public/admin/static/plugin/jQuery/2.2.4/jquery.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; -}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ca(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Fa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ba.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Oa(a,b,c||(g?"border":"content"),d,f)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]), -void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g,hb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(hb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var ib=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!ib.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,ib.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b)}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var jb=a.location,kb=n.now(),lb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var mb=/#.*$/,nb=/([?&])_=[^&]*/,ob=/^(.*?):[ \t]*([^\r\n]*)$/gm,pb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,qb=/^(?:GET|HEAD)$/,rb=/^\/\//,sb={},tb={},ub="*/".concat("*"),vb=d.createElement("a");vb.href=jb.href;function wb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function xb(a,b,c,d){var e={},f=a===tb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function yb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function zb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Ab(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:jb.href,type:"GET",isLocal:pb.test(jb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":ub,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?yb(yb(a,n.ajaxSettings),b):yb(n.ajaxSettings,a)},ajaxPrefilter:wb(sb),ajaxTransport:wb(tb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=ob.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||jb.href)+"").replace(mb,"").replace(rb,jb.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=vb.protocol+"//"+vb.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),xb(sb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!qb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(lb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=nb.test(f)?f.replace(nb,"$1_="+kb++):f+(lb.test(f)?"&":"?")+"_="+kb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+ub+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=xb(tb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=zb(m,x,d)),u=Ab(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Bb=/%20/g,Cb=/\[\]$/,Db=/\r?\n/g,Eb=/^(?:submit|button|image|reset|file)$/i,Fb=/^(?:input|select|textarea|keygen)/i;function Gb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Cb.test(a)?d(a,e):Gb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Gb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Gb(c,a[c],b,e);return d.join("&").replace(Bb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Fb.test(this.nodeName)&&!Eb.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Db,"\r\n")}}):{name:b.name,value:c.replace(Db,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Hb={0:200,1223:204},Ib=n.ajaxSettings.xhr();l.cors=!!Ib&&"withCredentials"in Ib,l.ajax=Ib=!!Ib,n.ajaxTransport(function(b){var c,d;return l.cors||Ib&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Hb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Jb=[],Kb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Jb.pop()||n.expando+"_"+kb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Kb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Kb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Kb,"$1"+e):b.jsonp!==!1&&(b.url+=(lb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Jb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Lb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Lb)return Lb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Mb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Mb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Mb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Nb=a.jQuery,Ob=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Ob),b&&a.jQuery===n&&(a.jQuery=Nb),n},b||(a.jQuery=a.$=n),n}); diff --git a/public/admin/static/plugin/jQuery/3.1.1/jquery.js b/public/admin/static/plugin/jQuery/3.1.1/jquery.js deleted file mode 100644 index 072e308..0000000 --- a/public/admin/static/plugin/jQuery/3.1.1/jquery.js +++ /dev/null @@ -1,10220 +0,0 @@ -/*! - * jQuery JavaScript Library v3.1.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2016-09-22T22:30Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.1.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + - "<select id='" + expando + "-\r\\' msallowcapture=''>" + - "<option selected=''></option></select>"; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "<a href='' disabled='disabled'></a>" + - "<select disabled='disabled'><option/></select>"; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = "<a href='#'></a>"; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = "<input/>"; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - resolve.call( undefined, value ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.call( undefined, value ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); - } else { - key = jQuery.camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "<select multiple='multiple'>", "</select>" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting <tbody> or other required elements. - thead: [ 1, "<table>", "</table>" ], - col: [ 2, "<table><colgroup>", "</colgroup></table>" ], - tr: [ 2, "<table><tbody>", "</tbody></table>" ], - td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = "<textarea>x</textarea>"; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG <use> instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: jQuery.isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /<script|<style|<link/i, - - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; - -function manipulationTarget( elem, content ) { - if ( jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1></$2>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - computeStyleTests(); - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - style = elem.style; - - computed = computed || getStyles( elem ); - - // Support: IE <=9 only - // getPropertyValue is only needed for .css('filter') (#12537) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; - - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var val, - valueIsBorderBox = true, - styles = getStyles( elem ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - if ( elem.getClientRects().length ) { - val = elem.getBoundingClientRect()[ name ]; - } - - // Some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - style[ name ] = value; - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || - ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, timerId, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function raf() { - if ( timerId ) { - window.requestAnimationFrame( raf ); - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 13 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( jQuery.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - if ( percent < 1 && length ) { - return remaining; - } else { - deferred.resolveWith( elem, [ animation ] ); - return false; - } - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - // attach callbacks from options - return animation.progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - // Go to the end state if fx are off or if document is hidden - if ( jQuery.fx.off || document.hidden ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Checks the timer has not already been removed - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - if ( timer() ) { - jQuery.fx.start(); - } else { - jQuery.timers.pop(); - } -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( !timerId ) { - timerId = window.requestAnimationFrame ? - window.requestAnimationFrame( raf ) : - window.setInterval( jQuery.fx.tick, jQuery.fx.interval ); - } -}; - -jQuery.fx.stop = function() { - if ( window.cancelAnimationFrame ) { - window.cancelAnimationFrame( timerId ); - } else { - window.clearInterval( timerId ); - } - - timerId = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - jQuery.nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -jQuery.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( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( jQuery.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( jQuery.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 13 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available, append data to url - if ( s.data ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "<script>" ).prop( { - charset: s.scriptCharset, - src: s.url - } ).on( - "load error", - callback = function( evt ) { - script.remove(); - callback = null; - if ( evt ) { - complete( evt.type === "error" ? 404 : 200, evt.type ); - } - } - ); - - // Use native DOM manipulation to avoid our domManip AJAX trickery - document.head.appendChild( script[ 0 ] ); - }, - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -var oldCallbacks = [], - rjsonp = /(=)\?(?=&|$)|\?\?/; - -// Default jsonp settings -jQuery.ajaxSetup( { - jsonp: "callback", - jsonpCallback: function() { - var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); - this[ callback ] = true; - return callback; - } -} ); - -// Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - - var callbackName, overwritten, responseContainer, - jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? - "url" : - typeof s.data === "string" && - ( s.contentType || "" ) - .indexOf( "application/x-www-form-urlencoded" ) === 0 && - rjsonp.test( s.data ) && "data" - ); - - // Handle iff the expected data type is "jsonp" or we have a parameter to set - if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { - - // Get callback name, remembering preexisting value associated with it - callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? - s.jsonpCallback() : - s.jsonpCallback; - - // Insert callback into url or form data - if ( jsonProp ) { - s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); - } else if ( s.jsonp !== false ) { - s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; - } - - // Use data converter to retrieve json after script execution - s.converters[ "script json" ] = function() { - if ( !responseContainer ) { - jQuery.error( callbackName + " was not called" ); - } - return responseContainer[ 0 ]; - }; - - // Force json dataType - s.dataTypes[ 0 ] = "json"; - - // Install callback - overwritten = window[ callbackName ]; - window[ callbackName ] = function() { - responseContainer = arguments; - }; - - // Clean-up function (fires after converters) - jqXHR.always( function() { - - // If previous value didn't exist - remove it - if ( overwritten === undefined ) { - jQuery( window ).removeProp( callbackName ); - - // Otherwise restore preexisting value - } else { - window[ callbackName ] = overwritten; - } - - // Save back as free - if ( s[ callbackName ] ) { - - // Make sure that re-using the options doesn't screw things around - s.jsonpCallback = originalSettings.jsonpCallback; - - // Save the callback name for future use - oldCallbacks.push( callbackName ); - } - - // Call if it was a function and we have a response - if ( responseContainer && jQuery.isFunction( overwritten ) ) { - overwritten( responseContainer[ 0 ] ); - } - - responseContainer = overwritten = undefined; - } ); - - // Delegate to script - return "script"; - } -} ); - - - - -// Support: Safari 8 only -// In Safari 8 documents created via document.implementation.createHTMLDocument -// collapse sibling forms: the second one becomes a child of the first one. -// Because of that, this security measure has to be disabled in Safari 8. -// https://bugs.webkit.org/show_bug.cgi?id=137337 -support.createHTMLDocument = ( function() { - var body = document.implementation.createHTMLDocument( "" ).body; - body.innerHTML = "<form></form><form></form>"; - return body.childNodes.length === 2; -} )(); - - -// Argument "data" should be string of html -// context (optional): If specified, the fragment will be created in this context, -// defaults to document -// keepScripts (optional): If true, will include scripts passed in the html string -jQuery.parseHTML = function( data, context, keepScripts ) { - if ( typeof data !== "string" ) { - return []; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - - var base, parsed, scripts; - - if ( !context ) { - - // Stop scripts or inline event handlers from being executed immediately - // by using document.implementation - if ( support.createHTMLDocument ) { - context = document.implementation.createHTMLDocument( "" ); - - // Set the base href for the created document - // so any parsed elements with URLs - // are based on the document's URL (gh-2965) - base = context.createElement( "base" ); - base.href = document.location.href; - context.head.appendChild( base ); - } else { - context = document; - } - } - - parsed = rsingleTag.exec( data ); - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[ 1 ] ) ]; - } - - parsed = buildFragment( [ data ], context, scripts ); - - if ( scripts && scripts.length ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); -}; - - -/** - * Load a url into a page - */ -jQuery.fn.load = function( url, params, callback ) { - var selector, type, response, - self = this, - off = url.indexOf( " " ); - - if ( off > -1 ) { - selector = stripAndCollapse( url.slice( off ) ); - url = url.slice( 0, off ); - } - - // If it's a function - if ( jQuery.isFunction( params ) ) { - - // We assume that it's the callback - callback = params; - params = undefined; - - // Otherwise, build a param string - } else if ( params && typeof params === "object" ) { - type = "POST"; - } - - // If we have elements to modify, make the request - if ( self.length > 0 ) { - jQuery.ajax( { - url: url, - - // If "type" variable is undefined, then "GET" method will be used. - // Make value of this field explicit since - // user can override it through ajaxSetup method - type: type || "GET", - dataType: "html", - data: params - } ).done( function( responseText ) { - - // Save response for use in complete callback - response = arguments; - - self.html( selector ? - - // If a selector was specified, locate the right elements in a dummy div - // Exclude scripts to avoid IE 'Permission Denied' errors - jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : - - // Otherwise use the full result - responseText ); - - // If the request succeeds, this function gets "data", "status", "jqXHR" - // but they are ignored because response was set above. - // If it fails, this function gets "jqXHR", "status", "error" - } ).always( callback && function( jqXHR, status ) { - self.each( function() { - callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); - } ); - } ); - } - - return this; -}; - - - - -// Attach a bunch of functions for handling common AJAX events -jQuery.each( [ - "ajaxStart", - "ajaxStop", - "ajaxComplete", - "ajaxError", - "ajaxSuccess", - "ajaxSend" -], function( i, type ) { - jQuery.fn[ type ] = function( fn ) { - return this.on( type, fn ); - }; -} ); - - - - -jQuery.expr.pseudos.animated = function( elem ) { - return jQuery.grep( jQuery.timers, function( fn ) { - return elem === fn.elem; - } ).length; -}; - - - - -/** - * Gets a window from an element - */ -function getWindow( elem ) { - return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView; -} - -jQuery.offset = { - setOffset: function( elem, options, i ) { - var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, - position = jQuery.css( elem, "position" ), - curElem = jQuery( elem ), - props = {}; - - // Set position first, in-case top/left are set even on static elem - if ( position === "static" ) { - elem.style.position = "relative"; - } - - curOffset = curElem.offset(); - curCSSTop = jQuery.css( elem, "top" ); - curCSSLeft = jQuery.css( elem, "left" ); - calculatePosition = ( position === "absolute" || position === "fixed" ) && - ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; - - // Need to be able to calculate position if either - // top or left is auto and position is either absolute or fixed - if ( calculatePosition ) { - curPosition = curElem.position(); - curTop = curPosition.top; - curLeft = curPosition.left; - - } else { - curTop = parseFloat( curCSSTop ) || 0; - curLeft = parseFloat( curCSSLeft ) || 0; - } - - if ( jQuery.isFunction( options ) ) { - - // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) - options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); - } - - if ( options.top != null ) { - props.top = ( options.top - curOffset.top ) + curTop; - } - if ( options.left != null ) { - props.left = ( options.left - curOffset.left ) + curLeft; - } - - if ( "using" in options ) { - options.using.call( elem, props ); - - } else { - curElem.css( props ); - } - } -}; - -jQuery.fn.extend( { - offset: function( options ) { - - // Preserve chaining for setter - if ( arguments.length ) { - return options === undefined ? - this : - this.each( function( i ) { - jQuery.offset.setOffset( this, options, i ); - } ); - } - - var docElem, win, rect, doc, - elem = this[ 0 ]; - - if ( !elem ) { - return; - } - - // Support: IE <=11 only - // Running getBoundingClientRect on a - // disconnected node in IE throws an error - if ( !elem.getClientRects().length ) { - return { top: 0, left: 0 }; - } - - rect = elem.getBoundingClientRect(); - - // Make sure element is not hidden (display: none) - if ( rect.width || rect.height ) { - doc = elem.ownerDocument; - win = getWindow( doc ); - docElem = doc.documentElement; - - return { - top: rect.top + win.pageYOffset - docElem.clientTop, - left: rect.left + win.pageXOffset - docElem.clientLeft - }; - } - - // Return zeros for disconnected and hidden elements (gh-2310) - return rect; - }, - - position: function() { - if ( !this[ 0 ] ) { - return; - } - - var offsetParent, offset, - elem = this[ 0 ], - parentOffset = { top: 0, left: 0 }; - - // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, - // because it is its only offset parent - if ( jQuery.css( elem, "position" ) === "fixed" ) { - - // Assume getBoundingClientRect is there when computed position is fixed - offset = elem.getBoundingClientRect(); - - } else { - - // Get *real* offsetParent - offsetParent = this.offsetParent(); - - // Get correct offsets - offset = this.offset(); - if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { - parentOffset = offsetParent.offset(); - } - - // Add offsetParent borders - parentOffset = { - top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ), - left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ) - }; - } - - // Subtract parent offsets and element margins - return { - top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), - left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) - }; - }, - - // This method will return documentElement in the following cases: - // 1) For the element inside the iframe without offsetParent, this method will return - // documentElement of the parent window - // 2) For the hidden or detached element - // 3) For body or html element, i.e. in case of the html node - it will return itself - // - // but those exceptions were never presented as a real life use-cases - // and might be considered as more preferable results. - // - // This logic, however, is not guaranteed and can change at any point in the future - offsetParent: function() { - return this.map( function() { - var offsetParent = this.offsetParent; - - while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { - offsetParent = offsetParent.offsetParent; - } - - return offsetParent || documentElement; - } ); - } -} ); - -// Create scrollLeft and scrollTop methods -jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { - var top = "pageYOffset" === prop; - - jQuery.fn[ method ] = function( val ) { - return access( this, function( elem, method, val ) { - var win = getWindow( elem ); - - if ( val === undefined ) { - return win ? win[ prop ] : elem[ method ]; - } - - if ( win ) { - win.scrollTo( - !top ? val : win.pageXOffset, - top ? val : win.pageYOffset - ); - - } else { - elem[ method ] = val; - } - }, method, val, arguments.length ); - }; -} ); - -// Support: Safari <=7 - 9.1, Chrome <=37 - 49 -// Add the top/left cssHooks using jQuery.fn.position -// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 -// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 -// getComputedStyle returns percent when specified for top/left/bottom/right; -// rather than make the css module depend on the offset module, just check for it here -jQuery.each( [ "top", "left" ], function( i, prop ) { - jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, - function( elem, computed ) { - if ( computed ) { - computed = curCSS( elem, prop ); - - // If curCSS returns percentage, fallback to offset - return rnumnonpx.test( computed ) ? - jQuery( elem ).position()[ prop ] + "px" : - computed; - } - } - ); -} ); - - -// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods -jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, - function( defaultExtra, funcName ) { - - // Margin is only for outerHeight, outerWidth - jQuery.fn[ funcName ] = function( margin, value ) { - var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), - extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); - - return access( this, function( elem, type, value ) { - var doc; - - if ( jQuery.isWindow( elem ) ) { - - // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) - return funcName.indexOf( "outer" ) === 0 ? - elem[ "inner" + name ] : - elem.document.documentElement[ "client" + name ]; - } - - // Get document width or height - if ( elem.nodeType === 9 ) { - doc = elem.documentElement; - - // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], - // whichever is greatest - return Math.max( - elem.body[ "scroll" + name ], doc[ "scroll" + name ], - elem.body[ "offset" + name ], doc[ "offset" + name ], - doc[ "client" + name ] - ); - } - - return value === undefined ? - - // Get width or height on the element, requesting but not forcing parseFloat - jQuery.css( elem, type, extra ) : - - // Set width or height on the element - jQuery.style( elem, type, value, extra ); - }, type, chainable ? margin : undefined, chainable ); - }; - } ); -} ); - - -jQuery.fn.extend( { - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length === 1 ? - this.off( selector, "**" ) : - this.off( types, selector || "**", fn ); - } -} ); - -jQuery.parseJSON = JSON.parse; - - - - -// Register as a named AMD module, since jQuery can be concatenated with other -// files that may use define, but not via a proper concatenation script that -// understands anonymous AMD modules. A named AMD is safest and most robust -// way to register. Lowercase jquery is used because AMD module names are -// derived from file names, and jQuery is normally delivered in a lowercase -// file name. Do this after creating the global so that if an AMD module wants -// to call noConflict to hide this version of jQuery, it will work. - -// Note that for maximum portability, libraries that are not jQuery should -// declare themselves as anonymous modules, and avoid setting a global if an -// AMD loader is present. jQuery is a special case. For more information, see -// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon - -if ( typeof define === "function" && define.amd ) { - define( "jquery", [], function() { - return jQuery; - } ); -} - - - - -var - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$; - -jQuery.noConflict = function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; -}; - -// Expose jQuery and $ identifiers, even in AMD -// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (#13566) -if ( !noGlobal ) { - window.jQuery = window.$ = jQuery; -} - - - - - -return jQuery; -} ); diff --git a/public/admin/static/plugin/jQuery/3.1.1/jquery.min.js b/public/admin/static/plugin/jQuery/3.1.1/jquery.min.js deleted file mode 100644 index 4c5be4c..0000000 --- a/public/admin/static/plugin/jQuery/3.1.1/jquery.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), -a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],_a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,"display"),ha([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=eb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:"number"!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db("show"),slideUp:db("hide"),slideToggle:db("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), -void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.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(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r}); diff --git a/public/admin/static/plugin/slimScroll/jquery.slimscroll.js b/public/admin/static/plugin/slimScroll/jquery.slimscroll.js deleted file mode 100644 index 90caed3..0000000 --- a/public/admin/static/plugin/slimScroll/jquery.slimscroll.js +++ /dev/null @@ -1,474 +0,0 @@ -/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. - * - * Version: 1.3.8 - * - */ -(function($) { - - $.fn.extend({ - slimScroll: function(options) { - - var defaults = { - - // width in pixels of the visible scroll area - width : 'auto', - - // height in pixels of the visible scroll area - height : '250px', - - // width in pixels of the scrollbar and rail - size : '7px', - - // scrollbar color, accepts any hex/color value - color: '#000', - - // scrollbar position - left/right - position : 'right', - - // distance in pixels between the side edge and the scrollbar - distance : '1px', - - // default scroll position on load - top / bottom / $('selector') - start : 'top', - - // sets scrollbar opacity - opacity : .4, - - // enables always-on mode for the scrollbar - alwaysVisible : false, - - // check if we should hide the scrollbar when user is hovering over - disableFadeOut : false, - - // sets visibility of the rail - railVisible : false, - - // sets rail color - railColor : '#333', - - // sets rail opacity - railOpacity : .2, - - // whether we should use jQuery UI Draggable to enable bar dragging - railDraggable : true, - - // defautlt CSS class of the slimscroll rail - railClass : 'slimScrollRail', - - // defautlt CSS class of the slimscroll bar - barClass : 'slimScrollBar', - - // defautlt CSS class of the slimscroll wrapper - wrapperClass : 'slimScrollDiv', - - // check if mousewheel should scroll the window if we reach top/bottom - allowPageScroll : false, - - // scroll amount applied to each mouse wheel step - wheelStep : 20, - - // scroll amount applied when user is using gestures - touchScrollStep : 200, - - // sets border radius - borderRadius: '7px', - - // sets border radius of the rail - railBorderRadius : '7px' - }; - - var o = $.extend(defaults, options); - - // do it for every element that matches selector - this.each(function(){ - - var isOverPanel, isOverBar, isDragg, queueHide, touchDif, - barHeight, percentScroll, lastScroll, - divS = '<div></div>', - minBarHeight = 30, - releaseScroll = false; - - // used in event handlers and for better minification - var me = $(this); - - // ensure we are not binding it again - if (me.parent().hasClass(o.wrapperClass)) - { - // start from last bar position - var offset = me.scrollTop(); - - // find bar and rail - bar = me.siblings('.' + o.barClass); - rail = me.siblings('.' + o.railClass); - - getBarHeight(); - - // check if we should scroll existing instance - if ($.isPlainObject(options)) - { - // Pass height: auto to an existing slimscroll object to force a resize after contents have changed - if ( 'height' in options && options.height == 'auto' ) { - me.parent().css('height', 'auto'); - me.css('height', 'auto'); - var height = me.parent().parent().height(); - me.parent().css('height', height); - me.css('height', height); - } else if ('height' in options) { - var h = options.height; - me.parent().css('height', h); - me.css('height', h); - } - - if ('scrollTo' in options) - { - // jump to a static point - offset = parseInt(o.scrollTo); - } - else if ('scrollBy' in options) - { - // jump by value pixels - offset += parseInt(o.scrollBy); - } - else if ('destroy' in options) - { - // remove slimscroll elements - bar.remove(); - rail.remove(); - me.unwrap(); - return; - } - - // scroll content by the given offset - scrollContent(offset, false, true); - } - - return; - } - else if ($.isPlainObject(options)) - { - if ('destroy' in options) - { - return; - } - } - - // optionally set height to the parent's height - o.height = (o.height == 'auto') ? me.parent().height() : o.height; - - // wrap content - var wrapper = $(divS) - .addClass(o.wrapperClass) - .css({ - position: 'relative', - overflow: 'hidden', - width: o.width, - height: o.height - }); - - // update style for the div - me.css({ - overflow: 'hidden', - width: o.width, - height: o.height - }); - - // create scrollbar rail - var rail = $(divS) - .addClass(o.railClass) - .css({ - width: o.size, - height: '100%', - position: 'absolute', - top: 0, - display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none', - 'border-radius': o.railBorderRadius, - background: o.railColor, - opacity: o.railOpacity, - zIndex: 90 - }); - - // create scrollbar - var bar = $(divS) - .addClass(o.barClass) - .css({ - background: o.color, - width: o.size, - position: 'absolute', - top: 0, - opacity: o.opacity, - display: o.alwaysVisible ? 'block' : 'none', - 'border-radius' : o.borderRadius, - BorderRadius: o.borderRadius, - MozBorderRadius: o.borderRadius, - WebkitBorderRadius: o.borderRadius, - zIndex: 99 - }); - - // set position - var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance }; - rail.css(posCss); - bar.css(posCss); - - // wrap it - me.wrap(wrapper); - - // append to parent div - me.parent().append(bar); - me.parent().append(rail); - - // make it draggable and no longer dependent on the jqueryUI - if (o.railDraggable){ - bar.bind("mousedown", function(e) { - var $doc = $(document); - isDragg = true; - t = parseFloat(bar.css('top')); - pageY = e.pageY; - - $doc.bind("mousemove.slimscroll", function(e){ - currTop = t + e.pageY - pageY; - bar.css('top', currTop); - scrollContent(0, bar.position().top, false);// scroll content - }); - - $doc.bind("mouseup.slimscroll", function(e) { - isDragg = false;hideBar(); - $doc.unbind('.slimscroll'); - }); - return false; - }).bind("selectstart.slimscroll", function(e){ - e.stopPropagation(); - e.preventDefault(); - return false; - }); - } - - // on rail over - rail.hover(function(){ - showBar(); - }, function(){ - hideBar(); - }); - - // on bar over - bar.hover(function(){ - isOverBar = true; - }, function(){ - isOverBar = false; - }); - - // show on parent mouseover - me.hover(function(){ - isOverPanel = true; - showBar(); - hideBar(); - }, function(){ - isOverPanel = false; - hideBar(); - }); - - // support for mobile - me.bind('touchstart', function(e,b){ - if (e.originalEvent.touches.length) - { - // record where touch started - touchDif = e.originalEvent.touches[0].pageY; - } - }); - - me.bind('touchmove', function(e){ - // prevent scrolling the page if necessary - if(!releaseScroll) - { - e.originalEvent.preventDefault(); - } - if (e.originalEvent.touches.length) - { - // see how far user swiped - var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep; - // scroll content - scrollContent(diff, true); - touchDif = e.originalEvent.touches[0].pageY; - } - }); - - // set up initial height - getBarHeight(); - - // check start position - if (o.start === 'bottom') - { - // scroll content to bottom - bar.css({ top: me.outerHeight() - bar.outerHeight() }); - scrollContent(0, true); - } - else if (o.start !== 'top') - { - // assume jQuery selector - scrollContent($(o.start).position().top, null, true); - - // make sure bar stays hidden - if (!o.alwaysVisible) { bar.hide(); } - } - - // attach scroll events - attachWheel(this); - - function _onWheel(e) - { - // use mouse wheel only when mouse is over - if (!isOverPanel) { return; } - - var e = e || window.event; - - var delta = 0; - if (e.wheelDelta) { delta = -e.wheelDelta/120; } - if (e.detail) { delta = e.detail / 3; } - - var target = e.target || e.srcTarget || e.srcElement; - if ($(target).closest('.' + o.wrapperClass).is(me.parent())) { - // scroll content - scrollContent(delta, true); - } - - // stop window scroll - if (e.preventDefault && !releaseScroll) { e.preventDefault(); } - if (!releaseScroll) { e.returnValue = false; } - } - - function scrollContent(y, isWheel, isJump) - { - releaseScroll = false; - var delta = y; - var maxTop = me.outerHeight() - bar.outerHeight(); - - if (isWheel) - { - // move bar with mouse wheel - delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight(); - - // move bar, make sure it doesn't go out - delta = Math.min(Math.max(delta, 0), maxTop); - - // if scrolling down, make sure a fractional change to the - // scroll position isn't rounded away when the scrollbar's CSS is set - // this flooring of delta would happened automatically when - // bar.css is set below, but we floor here for clarity - delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta); - - // scroll the scrollbar - bar.css({ top: delta + 'px' }); - } - - // calculate actual scroll amount - percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight()); - delta = percentScroll * (me[0].scrollHeight - me.outerHeight()); - - if (isJump) - { - delta = y; - var offsetTop = delta / me[0].scrollHeight * me.outerHeight(); - offsetTop = Math.min(Math.max(offsetTop, 0), maxTop); - bar.css({ top: offsetTop + 'px' }); - } - - // scroll content - me.scrollTop(delta); - - // fire scrolling event - me.trigger('slimscrolling', ~~delta); - - // ensure bar is visible - showBar(); - - // trigger hide when scroll is stopped - hideBar(); - } - - function attachWheel(target) - { - if (window.addEventListener) - { - target.addEventListener('DOMMouseScroll', _onWheel, false ); - target.addEventListener('mousewheel', _onWheel, false ); - } - else - { - document.attachEvent("onmousewheel", _onWheel) - } - } - - function getBarHeight() - { - // calculate scrollbar height and make sure it is not too small - barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight); - bar.css({ height: barHeight + 'px' }); - - // hide scrollbar if content is not long enough - var display = barHeight == me.outerHeight() ? 'none' : 'block'; - bar.css({ display: display }); - } - - function showBar() - { - // recalculate bar height - getBarHeight(); - clearTimeout(queueHide); - - // when bar reached top or bottom - if (percentScroll == ~~percentScroll) - { - //release wheel - releaseScroll = o.allowPageScroll; - - // publish approporiate event - if (lastScroll != percentScroll) - { - var msg = (~~percentScroll == 0) ? 'top' : 'bottom'; - me.trigger('slimscroll', msg); - } - } - else - { - releaseScroll = false; - } - lastScroll = percentScroll; - - // show only when required - if(barHeight >= me.outerHeight()) { - //allow window scroll - releaseScroll = true; - return; - } - bar.stop(true,true).fadeIn('fast'); - if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); } - } - - function hideBar() - { - // only hide when options allow it - if (!o.alwaysVisible) - { - queueHide = setTimeout(function(){ - if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg) - { - bar.fadeOut('slow'); - rail.fadeOut('slow'); - } - }, 1000); - } - } - - }); - - // maintain chainability - return this; - } - }); - - $.fn.extend({ - slimscroll: $.fn.slimScroll - }); - -})(jQuery); diff --git a/public/admin/static/plugin/slimScroll/jquery.slimscroll.min.js b/public/admin/static/plugin/slimScroll/jquery.slimscroll.min.js deleted file mode 100644 index 7531ab3..0000000 --- a/public/admin/static/plugin/slimScroll/jquery.slimscroll.min.js +++ /dev/null @@ -1,16 +0,0 @@ -/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. - * - * Version: 1.3.8 - * - */ -(function(e){e.fn.extend({slimScroll:function(f){var a=e.extend({width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},f);this.each(function(){function v(d){if(r){d=d||window.event; -var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&n(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function n(d,g,e){k=!1;var f=b.outerHeight()-c.outerHeight();g&&(g=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),g=Math.min(Math.max(g,0),f),g=0<d?Math.ceil(g):Math.floor(g),c.css({top:g+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());g= -l*(b[0].scrollHeight-b.outerHeight());e&&(g=d,d=g/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),f),c.css({top:d+"px"}));b.scrollTop(g);b.trigger("slimscrolling",~~g);w();p()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+"px"});var a=u==b.outerHeight()?"none":"block";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0, -!0).fadeIn("fast"),a.railVisible&&m.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut("slow"),m.fadeOut("slow"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var q=b.scrollTop(),c=b.siblings("."+a.barClass),m=b.siblings("."+a.railClass);x();if(e.isPlainObject(f)){if("height"in f&&"auto"==f.height){b.parent().css("height","auto");b.css("height","auto");var h=b.parent().parent().height();b.parent().css("height", -h);b.css("height",h)}else"height"in f&&(h=f.height,b.parent().css("height",h),b.css("height",h));if("scrollTo"in f)q=parseInt(a.scrollTo);else if("scrollBy"in f)q+=parseInt(a.scrollBy);else if("destroy"in f){c.remove();m.remove();b.unwrap();return}n(q,!1,!0)}}else if(!(e.isPlainObject(f)&&"destroy"in f)){a.height="auto"==a.height?b.parent().height():a.height;q=e("<div></div>").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden", -width:a.width,height:a.height});var m=e("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius, -WebkitBorderRadius:a.borderRadius,zIndex:99}),h="right"==a.position?{right:a.distance}:{left:a.distance};m.css(h);c.css(h);b.wrap(q);b.parent().append(c);b.parent().append(m);a.railDraggable&&c.bind("mousedown",function(a){var b=e(document);z=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);n(0,c.position().top,!1)});b.bind("mouseup.slimscroll",function(a){z=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll", -function(a){a.stopPropagation();a.preventDefault();return!1});m.hover(function(){w()},function(){p()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();p()},function(){r=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(n((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)}); -x();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),n(0,!0)):"top"!==a.start&&(n(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery); \ No newline at end of file diff --git a/public/admin/static/plugin/vue/vue.common.js b/public/admin/static/plugin/vue/vue.common.js deleted file mode 100644 index 07b55fe..0000000 --- a/public/admin/static/plugin/vue/vue.common.js +++ /dev/null @@ -1,5613 +0,0 @@ -/*! - * Vue.js v2.0.3 - * (c) 2014-2016 Evan You - * Released under the MIT License. - */ -'use strict'; - -/* */ - -/** - * Convert a value to a string that is actually rendered. - */ -function _toString (val) { - return val == null - ? '' - : typeof val === 'object' - ? JSON.stringify(val, null, 2) - : String(val) -} - -/** - * Convert a input value to a number for persistence. - * If the conversion fails, return original string. - */ -function toNumber (val) { - var n = parseFloat(val, 10); - return (n || n === 0) ? n : val -} - -/** - * Make a map and return a function for checking if a key - * is in that map. - */ -function makeMap ( - str, - expectsLowerCase -) { - var map = Object.create(null); - var list = str.split(','); - for (var i = 0; i < list.length; i++) { - map[list[i]] = true; - } - return expectsLowerCase - ? function (val) { return map[val.toLowerCase()]; } - : function (val) { return map[val]; } -} - -/** - * Check if a tag is a built-in tag. - */ -var isBuiltInTag = makeMap('slot,component', true); - -/** - * Remove an item from an array - */ -function remove$1 (arr, item) { - if (arr.length) { - var index = arr.indexOf(item); - if (index > -1) { - return arr.splice(index, 1) - } - } -} - -/** - * Check whether the object has the property. - */ -var hasOwnProperty = Object.prototype.hasOwnProperty; -function hasOwn (obj, key) { - return hasOwnProperty.call(obj, key) -} - -/** - * Check if value is primitive - */ -function isPrimitive (value) { - return typeof value === 'string' || typeof value === 'number' -} - -/** - * Create a cached version of a pure function. - */ -function cached (fn) { - var cache = Object.create(null); - return function cachedFn (str) { - var hit = cache[str]; - return hit || (cache[str] = fn(str)) - } -} - -/** - * Camelize a hyphen-delmited string. - */ -var camelizeRE = /-(\w)/g; -var camelize = cached(function (str) { - return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) -}); - -/** - * Capitalize a string. - */ -var capitalize = cached(function (str) { - return str.charAt(0).toUpperCase() + str.slice(1) -}); - -/** - * Hyphenate a camelCase string. - */ -var hyphenateRE = /([^-])([A-Z])/g; -var hyphenate = cached(function (str) { - return str - .replace(hyphenateRE, '$1-$2') - .replace(hyphenateRE, '$1-$2') - .toLowerCase() -}); - -/** - * Simple bind, faster than native - */ -function bind$1 (fn, ctx) { - function boundFn (a) { - var l = arguments.length; - return l - ? l > 1 - ? fn.apply(ctx, arguments) - : fn.call(ctx, a) - : fn.call(ctx) - } - // record original fn length - boundFn._length = fn.length; - return boundFn -} - -/** - * Convert an Array-like object to a real Array. - */ -function toArray (list, start) { - start = start || 0; - var i = list.length - start; - var ret = new Array(i); - while (i--) { - ret[i] = list[i + start]; - } - return ret -} - -/** - * Mix properties into target object. - */ -function extend (to, _from) { - for (var key in _from) { - to[key] = _from[key]; - } - return to -} - -/** - * Quick object check - this is primarily used to tell - * Objects from primitive values when we know the value - * is a JSON-compliant type. - */ -function isObject (obj) { - return obj !== null && typeof obj === 'object' -} - -/** - * Strict object type check. Only returns true - * for plain JavaScript objects. - */ -var toString = Object.prototype.toString; -var OBJECT_STRING = '[object Object]'; -function isPlainObject (obj) { - return toString.call(obj) === OBJECT_STRING -} - -/** - * Merge an Array of Objects into a single Object. - */ -function toObject (arr) { - var res = {}; - for (var i = 0; i < arr.length; i++) { - if (arr[i]) { - extend(res, arr[i]); - } - } - return res -} - -/** - * Perform no operation. - */ -function noop () {} - -/** - * Always return false. - */ -var no = function () { return false; }; - -/** - * Generate a static keys string from compiler modules. - */ -function genStaticKeys (modules) { - return modules.reduce(function (keys, m) { - return keys.concat(m.staticKeys || []) - }, []).join(',') -} - -/** - * Check if two values are loosely equal - that is, - * if they are plain objects, do they have the same shape? - */ -function looseEqual (a, b) { - /* eslint-disable eqeqeq */ - return a == b || ( - isObject(a) && isObject(b) - ? JSON.stringify(a) === JSON.stringify(b) - : false - ) - /* eslint-enable eqeqeq */ -} - -function looseIndexOf (arr, val) { - for (var i = 0; i < arr.length; i++) { - if (looseEqual(arr[i], val)) { return i } - } - return -1 -} - -/* */ - -var config = { - /** - * Option merge strategies (used in core/util/options) - */ - optionMergeStrategies: Object.create(null), - - /** - * Whether to suppress warnings. - */ - silent: false, - - /** - * Whether to enable devtools - */ - devtools: process.env.NODE_ENV !== 'production', - - /** - * Error handler for watcher errors - */ - errorHandler: null, - - /** - * Ignore certain custom elements - */ - ignoredElements: null, - - /** - * Custom user key aliases for v-on - */ - keyCodes: Object.create(null), - - /** - * Check if a tag is reserved so that it cannot be registered as a - * component. This is platform-dependent and may be overwritten. - */ - isReservedTag: no, - - /** - * Check if a tag is an unknown element. - * Platform-dependent. - */ - isUnknownElement: no, - - /** - * Get the namespace of an element - */ - getTagNamespace: noop, - - /** - * Check if an attribute must be bound using property, e.g. value - * Platform-dependent. - */ - mustUseProp: no, - - /** - * List of asset types that a component can own. - */ - _assetTypes: [ - 'component', - 'directive', - 'filter' - ], - - /** - * List of lifecycle hooks. - */ - _lifecycleHooks: [ - 'beforeCreate', - 'created', - 'beforeMount', - 'mounted', - 'beforeUpdate', - 'updated', - 'beforeDestroy', - 'destroyed', - 'activated', - 'deactivated' - ], - - /** - * Max circular updates allowed in a scheduler flush cycle. - */ - _maxUpdateCount: 100, - - /** - * Server rendering? - */ - _isServer: process.env.VUE_ENV === 'server' -}; - -/* */ - -/** - * Check if a string starts with $ or _ - */ -function isReserved (str) { - var c = (str + '').charCodeAt(0); - return c === 0x24 || c === 0x5F -} - -/** - * Define a property. - */ -function def (obj, key, val, enumerable) { - Object.defineProperty(obj, key, { - value: val, - enumerable: !!enumerable, - writable: true, - configurable: true - }); -} - -/** - * Parse simple path. - */ -var bailRE = /[^\w\.\$]/; -function parsePath (path) { - if (bailRE.test(path)) { - return - } else { - var segments = path.split('.'); - return function (obj) { - for (var i = 0; i < segments.length; i++) { - if (!obj) { return } - obj = obj[segments[i]]; - } - return obj - } - } -} - -/* */ -/* globals MutationObserver */ - -// can we use __proto__? -var hasProto = '__proto__' in {}; - -// Browser environment sniffing -var inBrowser = - typeof window !== 'undefined' && - Object.prototype.toString.call(window) !== '[object Object]'; - -var UA = inBrowser && window.navigator.userAgent.toLowerCase(); -var isIE = UA && /msie|trident/.test(UA); -var isIE9 = UA && UA.indexOf('msie 9.0') > 0; -var isEdge = UA && UA.indexOf('edge/') > 0; -var isAndroid = UA && UA.indexOf('android') > 0; -var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); - -// detect devtools -var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; - -/* istanbul ignore next */ -function isNative (Ctor) { - return /native code/.test(Ctor.toString()) -} - -/** - * Defer a task to execute it asynchronously. - */ -var nextTick = (function () { - var callbacks = []; - var pending = false; - var timerFunc; - - function nextTickHandler () { - pending = false; - var copies = callbacks.slice(0); - callbacks.length = 0; - for (var i = 0; i < copies.length; i++) { - copies[i](); - } - } - - // the nextTick behavior leverages the microtask queue, which can be accessed - // via either native Promise.then or MutationObserver. - // MutationObserver has wider support, however it is seriously bugged in - // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It - // completely stops working after triggering a few times... so, if native - // Promise is available, we will use it: - /* istanbul ignore if */ - if (typeof Promise !== 'undefined' && isNative(Promise)) { - var p = Promise.resolve(); - timerFunc = function () { - p.then(nextTickHandler); - // in problematic UIWebViews, Promise.then doesn't completely break, but - // it can get stuck in a weird state where callbacks are pushed into the - // microtask queue but the queue isn't being flushed, until the browser - // needs to do some other work, e.g. handle a timer. Therefore we can - // "force" the microtask queue to be flushed by adding an empty timer. - if (isIOS) { setTimeout(noop); } - }; - } else if (typeof MutationObserver !== 'undefined' && ( - isNative(MutationObserver) || - // PhantomJS and iOS 7.x - MutationObserver.toString() === '[object MutationObserverConstructor]' - )) { - // use MutationObserver where native Promise is not available, - // e.g. PhantomJS IE11, iOS7, Android 4.4 - var counter = 1; - var observer = new MutationObserver(nextTickHandler); - var textNode = document.createTextNode(String(counter)); - observer.observe(textNode, { - characterData: true - }); - timerFunc = function () { - counter = (counter + 1) % 2; - textNode.data = String(counter); - }; - } else { - // fallback to setTimeout - /* istanbul ignore next */ - timerFunc = function () { - setTimeout(nextTickHandler, 0); - }; - } - - return function queueNextTick (cb, ctx) { - var func = ctx - ? function () { cb.call(ctx); } - : cb; - callbacks.push(func); - if (!pending) { - pending = true; - timerFunc(); - } - } -})(); - -var _Set; -/* istanbul ignore if */ -if (typeof Set !== 'undefined' && isNative(Set)) { - // use native Set when available. - _Set = Set; -} else { - // a non-standard Set polyfill that only works with primitive keys. - _Set = (function () { - function Set () { - this.set = Object.create(null); - } - Set.prototype.has = function has (key) { - return this.set[key] !== undefined - }; - Set.prototype.add = function add (key) { - this.set[key] = 1; - }; - Set.prototype.clear = function clear () { - this.set = Object.create(null); - }; - - return Set; - }()); -} - -/* not type checking this file because flow doesn't play well with Proxy */ - -var hasProxy; -var proxyHandlers; -var initProxy; - -if (process.env.NODE_ENV !== 'production') { - var allowedGlobals = makeMap( - 'Infinity,undefined,NaN,isFinite,isNaN,' + - 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + - 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + - 'require' // for Webpack/Browserify - ); - - hasProxy = - typeof Proxy !== 'undefined' && - Proxy.toString().match(/native code/); - - proxyHandlers = { - has: function has (target, key) { - var has = key in target; - var isAllowed = allowedGlobals(key) || key.charAt(0) === '_'; - if (!has && !isAllowed) { - warn( - "Property or method \"" + key + "\" is not defined on the instance but " + - "referenced during render. Make sure to declare reactive data " + - "properties in the data option.", - target - ); - } - return has || !isAllowed - } - }; - - initProxy = function initProxy (vm) { - if (hasProxy) { - vm._renderProxy = new Proxy(vm, proxyHandlers); - } else { - vm._renderProxy = vm; - } - }; -} - -/* */ - - -var uid$2 = 0; - -/** - * A dep is an observable that can have multiple - * directives subscribing to it. - */ -var Dep = function Dep () { - this.id = uid$2++; - this.subs = []; -}; - -Dep.prototype.addSub = function addSub (sub) { - this.subs.push(sub); -}; - -Dep.prototype.removeSub = function removeSub (sub) { - remove$1(this.subs, sub); -}; - -Dep.prototype.depend = function depend () { - if (Dep.target) { - Dep.target.addDep(this); - } -}; - -Dep.prototype.notify = function notify () { - // stablize the subscriber list first - var subs = this.subs.slice(); - for (var i = 0, l = subs.length; i < l; i++) { - subs[i].update(); - } -}; - -// the current target watcher being evaluated. -// this is globally unique because there could be only one -// watcher being evaluated at any time. -Dep.target = null; -var targetStack = []; - -function pushTarget (_target) { - if (Dep.target) { targetStack.push(Dep.target); } - Dep.target = _target; -} - -function popTarget () { - Dep.target = targetStack.pop(); -} - -/* */ - - -var queue = []; -var has$1 = {}; -var circular = {}; -var waiting = false; -var flushing = false; -var index = 0; - -/** - * Reset the scheduler's state. - */ -function resetSchedulerState () { - queue.length = 0; - has$1 = {}; - if (process.env.NODE_ENV !== 'production') { - circular = {}; - } - waiting = flushing = false; -} - -/** - * Flush both queues and run the watchers. - */ -function flushSchedulerQueue () { - flushing = true; - - // Sort queue before flush. - // This ensures that: - // 1. Components are updated from parent to child. (because parent is always - // created before the child) - // 2. A component's user watchers are run before its render watcher (because - // user watchers are created before the render watcher) - // 3. If a component is destroyed during a parent component's watcher run, - // its watchers can be skipped. - queue.sort(function (a, b) { return a.id - b.id; }); - - // do not cache length because more watchers might be pushed - // as we run existing watchers - for (index = 0; index < queue.length; index++) { - var watcher = queue[index]; - var id = watcher.id; - has$1[id] = null; - watcher.run(); - // in dev build, check and stop circular updates. - if (process.env.NODE_ENV !== 'production' && has$1[id] != null) { - circular[id] = (circular[id] || 0) + 1; - if (circular[id] > config._maxUpdateCount) { - warn( - 'You may have an infinite update loop ' + ( - watcher.user - ? ("in watcher with expression \"" + (watcher.expression) + "\"") - : "in a component render function." - ), - watcher.vm - ); - break - } - } - } - - // devtool hook - /* istanbul ignore if */ - if (devtools && config.devtools) { - devtools.emit('flush'); - } - - resetSchedulerState(); -} - -/** - * Push a watcher into the watcher queue. - * Jobs with duplicate IDs will be skipped unless it's - * pushed when the queue is being flushed. - */ -function queueWatcher (watcher) { - var id = watcher.id; - if (has$1[id] == null) { - has$1[id] = true; - if (!flushing) { - queue.push(watcher); - } else { - // if already flushing, splice the watcher based on its id - // if already past its id, it will be run next immediately. - var i = queue.length - 1; - while (i >= 0 && queue[i].id > watcher.id) { - i--; - } - queue.splice(Math.max(i, index) + 1, 0, watcher); - } - // queue the flush - if (!waiting) { - waiting = true; - nextTick(flushSchedulerQueue); - } - } -} - -/* */ - -var uid$1 = 0; - -/** - * A watcher parses an expression, collects dependencies, - * and fires callback when the expression value changes. - * This is used for both the $watch() api and directives. - */ -var Watcher = function Watcher ( - vm, - expOrFn, - cb, - options -) { - if ( options === void 0 ) options = {}; - - this.vm = vm; - vm._watchers.push(this); - // options - this.deep = !!options.deep; - this.user = !!options.user; - this.lazy = !!options.lazy; - this.sync = !!options.sync; - this.expression = expOrFn.toString(); - this.cb = cb; - this.id = ++uid$1; // uid for batching - this.active = true; - this.dirty = this.lazy; // for lazy watchers - this.deps = []; - this.newDeps = []; - this.depIds = new _Set(); - this.newDepIds = new _Set(); - // parse expression for getter - if (typeof expOrFn === 'function') { - this.getter = expOrFn; - } else { - this.getter = parsePath(expOrFn); - if (!this.getter) { - this.getter = function () {}; - process.env.NODE_ENV !== 'production' && warn( - "Failed watching path: \"" + expOrFn + "\" " + - 'Watcher only accepts simple dot-delimited paths. ' + - 'For full control, use a function instead.', - vm - ); - } - } - this.value = this.lazy - ? undefined - : this.get(); -}; - -/** - * Evaluate the getter, and re-collect dependencies. - */ -Watcher.prototype.get = function get () { - pushTarget(this); - var value = this.getter.call(this.vm, this.vm); - // "touch" every property so they are all tracked as - // dependencies for deep watching - if (this.deep) { - traverse(value); - } - popTarget(); - this.cleanupDeps(); - return value -}; - -/** - * Add a dependency to this directive. - */ -Watcher.prototype.addDep = function addDep (dep) { - var id = dep.id; - if (!this.newDepIds.has(id)) { - this.newDepIds.add(id); - this.newDeps.push(dep); - if (!this.depIds.has(id)) { - dep.addSub(this); - } - } -}; - -/** - * Clean up for dependency collection. - */ -Watcher.prototype.cleanupDeps = function cleanupDeps () { - var this$1 = this; - - var i = this.deps.length; - while (i--) { - var dep = this$1.deps[i]; - if (!this$1.newDepIds.has(dep.id)) { - dep.removeSub(this$1); - } - } - var tmp = this.depIds; - this.depIds = this.newDepIds; - this.newDepIds = tmp; - this.newDepIds.clear(); - tmp = this.deps; - this.deps = this.newDeps; - this.newDeps = tmp; - this.newDeps.length = 0; -}; - -/** - * Subscriber interface. - * Will be called when a dependency changes. - */ -Watcher.prototype.update = function update () { - /* istanbul ignore else */ - if (this.lazy) { - this.dirty = true; - } else if (this.sync) { - this.run(); - } else { - queueWatcher(this); - } -}; - -/** - * Scheduler job interface. - * Will be called by the scheduler. - */ -Watcher.prototype.run = function run () { - if (this.active) { - var value = this.get(); - if ( - value !== this.value || - // Deep watchers and watchers on Object/Arrays should fire even - // when the value is the same, because the value may - // have mutated. - isObject(value) || - this.deep - ) { - // set new value - var oldValue = this.value; - this.value = value; - if (this.user) { - try { - this.cb.call(this.vm, value, oldValue); - } catch (e) { - process.env.NODE_ENV !== 'production' && warn( - ("Error in watcher \"" + (this.expression) + "\""), - this.vm - ); - /* istanbul ignore else */ - if (config.errorHandler) { - config.errorHandler.call(null, e, this.vm); - } else { - throw e - } - } - } else { - this.cb.call(this.vm, value, oldValue); - } - } - } -}; - -/** - * Evaluate the value of the watcher. - * This only gets called for lazy watchers. - */ -Watcher.prototype.evaluate = function evaluate () { - this.value = this.get(); - this.dirty = false; -}; - -/** - * Depend on all deps collected by this watcher. - */ -Watcher.prototype.depend = function depend () { - var this$1 = this; - - var i = this.deps.length; - while (i--) { - this$1.deps[i].depend(); - } -}; - -/** - * Remove self from all dependencies' subcriber list. - */ -Watcher.prototype.teardown = function teardown () { - var this$1 = this; - - if (this.active) { - // remove self from vm's watcher list - // this is a somewhat expensive operation so we skip it - // if the vm is being destroyed or is performing a v-for - // re-render (the watcher list is then filtered by v-for). - if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) { - remove$1(this.vm._watchers, this); - } - var i = this.deps.length; - while (i--) { - this$1.deps[i].removeSub(this$1); - } - this.active = false; - } -}; - -/** - * Recursively traverse an object to evoke all converted - * getters, so that every nested property inside the object - * is collected as a "deep" dependency. - */ -var seenObjects = new _Set(); -function traverse (val, seen) { - var i, keys; - if (!seen) { - seen = seenObjects; - seen.clear(); - } - var isA = Array.isArray(val); - var isO = isObject(val); - if ((isA || isO) && Object.isExtensible(val)) { - if (val.__ob__) { - var depId = val.__ob__.dep.id; - if (seen.has(depId)) { - return - } else { - seen.add(depId); - } - } - if (isA) { - i = val.length; - while (i--) { traverse(val[i], seen); } - } else if (isO) { - keys = Object.keys(val); - i = keys.length; - while (i--) { traverse(val[keys[i]], seen); } - } - } -} - -/* - * not type checking this file because flow doesn't play well with - * dynamically accessing methods on Array prototype - */ - -var arrayProto = Array.prototype; -var arrayMethods = Object.create(arrayProto);[ - 'push', - 'pop', - 'shift', - 'unshift', - 'splice', - 'sort', - 'reverse' -] -.forEach(function (method) { - // cache original method - var original = arrayProto[method]; - def(arrayMethods, method, function mutator () { - var arguments$1 = arguments; - - // avoid leaking arguments: - // http://jsperf.com/closure-with-arguments - var i = arguments.length; - var args = new Array(i); - while (i--) { - args[i] = arguments$1[i]; - } - var result = original.apply(this, args); - var ob = this.__ob__; - var inserted; - switch (method) { - case 'push': - inserted = args; - break - case 'unshift': - inserted = args; - break - case 'splice': - inserted = args.slice(2); - break - } - if (inserted) { ob.observeArray(inserted); } - // notify change - ob.dep.notify(); - return result - }); -}); - -/* */ - -var arrayKeys = Object.getOwnPropertyNames(arrayMethods); - -/** - * By default, when a reactive property is set, the new value is - * also converted to become reactive. However when passing down props, - * we don't want to force conversion because the value may be a nested value - * under a frozen data structure. Converting it would defeat the optimization. - */ -var observerState = { - shouldConvert: true, - isSettingProps: false -}; - -/** - * Observer class that are attached to each observed - * object. Once attached, the observer converts target - * object's property keys into getter/setters that - * collect dependencies and dispatches updates. - */ -var Observer = function Observer (value) { - this.value = value; - this.dep = new Dep(); - this.vmCount = 0; - def(value, '__ob__', this); - if (Array.isArray(value)) { - var augment = hasProto - ? protoAugment - : copyAugment; - augment(value, arrayMethods, arrayKeys); - this.observeArray(value); - } else { - this.walk(value); - } -}; - -/** - * Walk through each property and convert them into - * getter/setters. This method should only be called when - * value type is Object. - */ -Observer.prototype.walk = function walk (obj) { - var keys = Object.keys(obj); - for (var i = 0; i < keys.length; i++) { - defineReactive$$1(obj, keys[i], obj[keys[i]]); - } -}; - -/** - * Observe a list of Array items. - */ -Observer.prototype.observeArray = function observeArray (items) { - for (var i = 0, l = items.length; i < l; i++) { - observe(items[i]); - } -}; - -// helpers - -/** - * Augment an target Object or Array by intercepting - * the prototype chain using __proto__ - */ -function protoAugment (target, src) { - /* eslint-disable no-proto */ - target.__proto__ = src; - /* eslint-enable no-proto */ -} - -/** - * Augment an target Object or Array by defining - * hidden properties. - * - * istanbul ignore next - */ -function copyAugment (target, src, keys) { - for (var i = 0, l = keys.length; i < l; i++) { - var key = keys[i]; - def(target, key, src[key]); - } -} - -/** - * Attempt to create an observer instance for a value, - * returns the new observer if successfully observed, - * or the existing observer if the value already has one. - */ -function observe (value) { - if (!isObject(value)) { - return - } - var ob; - if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { - ob = value.__ob__; - } else if ( - observerState.shouldConvert && - !config._isServer && - (Array.isArray(value) || isPlainObject(value)) && - Object.isExtensible(value) && - !value._isVue - ) { - ob = new Observer(value); - } - return ob -} - -/** - * Define a reactive property on an Object. - */ -function defineReactive$$1 ( - obj, - key, - val, - customSetter -) { - var dep = new Dep(); - - var property = Object.getOwnPropertyDescriptor(obj, key); - if (property && property.configurable === false) { - return - } - - // cater for pre-defined getter/setters - var getter = property && property.get; - var setter = property && property.set; - - var childOb = observe(val); - Object.defineProperty(obj, key, { - enumerable: true, - configurable: true, - get: function reactiveGetter () { - var value = getter ? getter.call(obj) : val; - if (Dep.target) { - dep.depend(); - if (childOb) { - childOb.dep.depend(); - } - if (Array.isArray(value)) { - dependArray(value); - } - } - return value - }, - set: function reactiveSetter (newVal) { - var value = getter ? getter.call(obj) : val; - if (newVal === value) { - return - } - if (process.env.NODE_ENV !== 'production' && customSetter) { - customSetter(); - } - if (setter) { - setter.call(obj, newVal); - } else { - val = newVal; - } - childOb = observe(newVal); - dep.notify(); - } - }); -} - -/** - * Set a property on an object. Adds the new property and - * triggers change notification if the property doesn't - * already exist. - */ -function set (obj, key, val) { - if (Array.isArray(obj)) { - obj.splice(key, 1, val); - return val - } - if (hasOwn(obj, key)) { - obj[key] = val; - return - } - var ob = obj.__ob__; - if (obj._isVue || (ob && ob.vmCount)) { - process.env.NODE_ENV !== 'production' && warn( - 'Avoid adding reactive properties to a Vue instance or its root $data ' + - 'at runtime - declare it upfront in the data option.' - ); - return - } - if (!ob) { - obj[key] = val; - return - } - defineReactive$$1(ob.value, key, val); - ob.dep.notify(); - return val -} - -/** - * Delete a property and trigger change if necessary. - */ -function del (obj, key) { - var ob = obj.__ob__; - if (obj._isVue || (ob && ob.vmCount)) { - process.env.NODE_ENV !== 'production' && warn( - 'Avoid deleting properties on a Vue instance or its root $data ' + - '- just set it to null.' - ); - return - } - if (!hasOwn(obj, key)) { - return - } - delete obj[key]; - if (!ob) { - return - } - ob.dep.notify(); -} - -/** - * Collect dependencies on array elements when the array is touched, since - * we cannot intercept array element access like property getters. - */ -function dependArray (value) { - for (var e = void 0, i = 0, l = value.length; i < l; i++) { - e = value[i]; - e && e.__ob__ && e.__ob__.dep.depend(); - if (Array.isArray(e)) { - dependArray(e); - } - } -} - -/* */ - -function initState (vm) { - vm._watchers = []; - initProps(vm); - initData(vm); - initComputed(vm); - initMethods(vm); - initWatch(vm); -} - -function initProps (vm) { - var props = vm.$options.props; - if (props) { - var propsData = vm.$options.propsData || {}; - var keys = vm.$options._propKeys = Object.keys(props); - var isRoot = !vm.$parent; - // root instance props should be converted - observerState.shouldConvert = isRoot; - var loop = function ( i ) { - var key = keys[i]; - /* istanbul ignore else */ - if (process.env.NODE_ENV !== 'production') { - defineReactive$$1(vm, key, validateProp(key, props, propsData, vm), function () { - if (vm.$parent && !observerState.isSettingProps) { - warn( - "Avoid mutating a prop directly since the value will be " + - "overwritten whenever the parent component re-renders. " + - "Instead, use a data or computed property based on the prop's " + - "value. Prop being mutated: \"" + key + "\"", - vm - ); - } - }); - } else { - defineReactive$$1(vm, key, validateProp(key, props, propsData, vm)); - } - }; - - for (var i = 0; i < keys.length; i++) loop( i ); - observerState.shouldConvert = true; - } -} - -function initData (vm) { - var data = vm.$options.data; - data = vm._data = typeof data === 'function' - ? data.call(vm) - : data || {}; - if (!isPlainObject(data)) { - data = {}; - process.env.NODE_ENV !== 'production' && warn( - 'data functions should return an object.', - vm - ); - } - // proxy data on instance - var keys = Object.keys(data); - var props = vm.$options.props; - var i = keys.length; - while (i--) { - if (props && hasOwn(props, keys[i])) { - process.env.NODE_ENV !== 'production' && warn( - "The data property \"" + (keys[i]) + "\" is already declared as a prop. " + - "Use prop default value instead.", - vm - ); - } else { - proxy(vm, keys[i]); - } - } - // observe data - observe(data); - data.__ob__ && data.__ob__.vmCount++; -} - -var computedSharedDefinition = { - enumerable: true, - configurable: true, - get: noop, - set: noop -}; - -function initComputed (vm) { - var computed = vm.$options.computed; - if (computed) { - for (var key in computed) { - var userDef = computed[key]; - if (typeof userDef === 'function') { - computedSharedDefinition.get = makeComputedGetter(userDef, vm); - computedSharedDefinition.set = noop; - } else { - computedSharedDefinition.get = userDef.get - ? userDef.cache !== false - ? makeComputedGetter(userDef.get, vm) - : bind$1(userDef.get, vm) - : noop; - computedSharedDefinition.set = userDef.set - ? bind$1(userDef.set, vm) - : noop; - } - Object.defineProperty(vm, key, computedSharedDefinition); - } - } -} - -function makeComputedGetter (getter, owner) { - var watcher = new Watcher(owner, getter, noop, { - lazy: true - }); - return function computedGetter () { - if (watcher.dirty) { - watcher.evaluate(); - } - if (Dep.target) { - watcher.depend(); - } - return watcher.value - } -} - -function initMethods (vm) { - var methods = vm.$options.methods; - if (methods) { - for (var key in methods) { - vm[key] = methods[key] == null ? noop : bind$1(methods[key], vm); - if (process.env.NODE_ENV !== 'production' && methods[key] == null) { - warn( - "method \"" + key + "\" has an undefined value in the component definition. " + - "Did you reference the function correctly?", - vm - ); - } - } - } -} - -function initWatch (vm) { - var watch = vm.$options.watch; - if (watch) { - for (var key in watch) { - var handler = watch[key]; - if (Array.isArray(handler)) { - for (var i = 0; i < handler.length; i++) { - createWatcher(vm, key, handler[i]); - } - } else { - createWatcher(vm, key, handler); - } - } - } -} - -function createWatcher (vm, key, handler) { - var options; - if (isPlainObject(handler)) { - options = handler; - handler = handler.handler; - } - if (typeof handler === 'string') { - handler = vm[handler]; - } - vm.$watch(key, handler, options); -} - -function stateMixin (Vue) { - // flow somehow has problems with directly declared definition object - // when using Object.defineProperty, so we have to procedurally build up - // the object here. - var dataDef = {}; - dataDef.get = function () { - return this._data - }; - if (process.env.NODE_ENV !== 'production') { - dataDef.set = function (newData) { - warn( - 'Avoid replacing instance root $data. ' + - 'Use nested data properties instead.', - this - ); - }; - } - Object.defineProperty(Vue.prototype, '$data', dataDef); - - Vue.prototype.$set = set; - Vue.prototype.$delete = del; - - Vue.prototype.$watch = function ( - expOrFn, - cb, - options - ) { - var vm = this; - options = options || {}; - options.user = true; - var watcher = new Watcher(vm, expOrFn, cb, options); - if (options.immediate) { - cb.call(vm, watcher.value); - } - return function unwatchFn () { - watcher.teardown(); - } - }; -} - -function proxy (vm, key) { - if (!isReserved(key)) { - Object.defineProperty(vm, key, { - configurable: true, - enumerable: true, - get: function proxyGetter () { - return vm._data[key] - }, - set: function proxySetter (val) { - vm._data[key] = val; - } - }); - } -} - -/* */ - -var VNode = function VNode ( - tag, - data, - children, - text, - elm, - ns, - context, - componentOptions -) { - this.tag = tag; - this.data = data; - this.children = children; - this.text = text; - this.elm = elm; - this.ns = ns; - this.context = context; - this.functionalContext = undefined; - this.key = data && data.key; - this.componentOptions = componentOptions; - this.child = undefined; - this.parent = undefined; - this.raw = false; - this.isStatic = false; - this.isRootInsert = true; - this.isComment = false; - this.isCloned = false; -}; - -var emptyVNode = function () { - var node = new VNode(); - node.text = ''; - node.isComment = true; - return node -}; - -// optimized shallow clone -// used for static nodes and slot nodes because they may be reused across -// multiple renders, cloning them avoids errors when DOM manipulations rely -// on their elm reference. -function cloneVNode (vnode) { - var cloned = new VNode( - vnode.tag, - vnode.data, - vnode.children, - vnode.text, - vnode.elm, - vnode.ns, - vnode.context, - vnode.componentOptions - ); - cloned.isStatic = vnode.isStatic; - cloned.key = vnode.key; - cloned.isCloned = true; - return cloned -} - -function cloneVNodes (vnodes) { - var res = new Array(vnodes.length); - for (var i = 0; i < vnodes.length; i++) { - res[i] = cloneVNode(vnodes[i]); - } - return res -} - -/* */ - -function mergeVNodeHook (def, hookKey, hook, key) { - key = key + hookKey; - var injectedHash = def.__injected || (def.__injected = {}); - if (!injectedHash[key]) { - injectedHash[key] = true; - var oldHook = def[hookKey]; - if (oldHook) { - def[hookKey] = function () { - oldHook.apply(this, arguments); - hook.apply(this, arguments); - }; - } else { - def[hookKey] = hook; - } - } -} - -/* */ - -function updateListeners ( - on, - oldOn, - add, - remove$$1, - vm -) { - var name, cur, old, fn, event, capture; - for (name in on) { - cur = on[name]; - old = oldOn[name]; - if (!cur) { - process.env.NODE_ENV !== 'production' && warn( - "Invalid handler for event \"" + name + "\": got " + String(cur), - vm - ); - } else if (!old) { - capture = name.charAt(0) === '!'; - event = capture ? name.slice(1) : name; - if (Array.isArray(cur)) { - add(event, (cur.invoker = arrInvoker(cur)), capture); - } else { - if (!cur.invoker) { - fn = cur; - cur = on[name] = {}; - cur.fn = fn; - cur.invoker = fnInvoker(cur); - } - add(event, cur.invoker, capture); - } - } else if (cur !== old) { - if (Array.isArray(old)) { - old.length = cur.length; - for (var i = 0; i < old.length; i++) { old[i] = cur[i]; } - on[name] = old; - } else { - old.fn = cur; - on[name] = old; - } - } - } - for (name in oldOn) { - if (!on[name]) { - event = name.charAt(0) === '!' ? name.slice(1) : name; - remove$$1(event, oldOn[name].invoker); - } - } -} - -function arrInvoker (arr) { - return function (ev) { - var arguments$1 = arguments; - - var single = arguments.length === 1; - for (var i = 0; i < arr.length; i++) { - single ? arr[i](ev) : arr[i].apply(null, arguments$1); - } - } -} - -function fnInvoker (o) { - return function (ev) { - var single = arguments.length === 1; - single ? o.fn(ev) : o.fn.apply(null, arguments); - } -} - -/* */ - -function normalizeChildren ( - children, - ns, - nestedIndex -) { - if (isPrimitive(children)) { - return [createTextVNode(children)] - } - if (Array.isArray(children)) { - var res = []; - for (var i = 0, l = children.length; i < l; i++) { - var c = children[i]; - var last = res[res.length - 1]; - // nested - if (Array.isArray(c)) { - res.push.apply(res, normalizeChildren(c, ns, ((nestedIndex || '') + "_" + i))); - } else if (isPrimitive(c)) { - if (last && last.text) { - last.text += String(c); - } else if (c !== '') { - // convert primitive to vnode - res.push(createTextVNode(c)); - } - } else if (c instanceof VNode) { - if (c.text && last && last.text) { - last.text += c.text; - } else { - // inherit parent namespace - if (ns) { - applyNS(c, ns); - } - // default key for nested array children (likely generated by v-for) - if (c.tag && c.key == null && nestedIndex != null) { - c.key = "__vlist" + nestedIndex + "_" + i + "__"; - } - res.push(c); - } - } - } - return res - } -} - -function createTextVNode (val) { - return new VNode(undefined, undefined, undefined, String(val)) -} - -function applyNS (vnode, ns) { - if (vnode.tag && !vnode.ns) { - vnode.ns = ns; - if (vnode.children) { - for (var i = 0, l = vnode.children.length; i < l; i++) { - applyNS(vnode.children[i], ns); - } - } - } -} - -/* */ - -function getFirstComponentChild (children) { - return children && children.filter(function (c) { return c && c.componentOptions; })[0] -} - -/* */ - -var activeInstance = null; - -function initLifecycle (vm) { - var options = vm.$options; - - // locate first non-abstract parent - var parent = options.parent; - if (parent && !options.abstract) { - while (parent.$options.abstract && parent.$parent) { - parent = parent.$parent; - } - parent.$children.push(vm); - } - - vm.$parent = parent; - vm.$root = parent ? parent.$root : vm; - - vm.$children = []; - vm.$refs = {}; - - vm._watcher = null; - vm._inactive = false; - vm._isMounted = false; - vm._isDestroyed = false; - vm._isBeingDestroyed = false; -} - -function lifecycleMixin (Vue) { - Vue.prototype._mount = function ( - el, - hydrating - ) { - var vm = this; - vm.$el = el; - if (!vm.$options.render) { - vm.$options.render = emptyVNode; - if (process.env.NODE_ENV !== 'production') { - /* istanbul ignore if */ - if (vm.$options.template) { - warn( - 'You are using the runtime-only build of Vue where the template ' + - 'option is not available. Either pre-compile the templates into ' + - 'render functions, or use the compiler-included build.', - vm - ); - } else { - warn( - 'Failed to mount component: template or render function not defined.', - vm - ); - } - } - } - callHook(vm, 'beforeMount'); - vm._watcher = new Watcher(vm, function () { - vm._update(vm._render(), hydrating); - }, noop); - hydrating = false; - // manually mounted instance, call mounted on self - // mounted is called for render-created child components in its inserted hook - if (vm.$vnode == null) { - vm._isMounted = true; - callHook(vm, 'mounted'); - } - return vm - }; - - Vue.prototype._update = function (vnode, hydrating) { - var vm = this; - if (vm._isMounted) { - callHook(vm, 'beforeUpdate'); - } - var prevEl = vm.$el; - var prevActiveInstance = activeInstance; - activeInstance = vm; - var prevVnode = vm._vnode; - vm._vnode = vnode; - if (!prevVnode) { - // Vue.prototype.__patch__ is injected in entry points - // based on the rendering backend used. - vm.$el = vm.__patch__(vm.$el, vnode, hydrating); - } else { - vm.$el = vm.__patch__(prevVnode, vnode); - } - activeInstance = prevActiveInstance; - // update __vue__ reference - if (prevEl) { - prevEl.__vue__ = null; - } - if (vm.$el) { - vm.$el.__vue__ = vm; - } - // if parent is an HOC, update its $el as well - if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) { - vm.$parent.$el = vm.$el; - } - if (vm._isMounted) { - callHook(vm, 'updated'); - } - }; - - Vue.prototype._updateFromParent = function ( - propsData, - listeners, - parentVnode, - renderChildren - ) { - var vm = this; - var hasChildren = !!(vm.$options._renderChildren || renderChildren); - vm.$options._parentVnode = parentVnode; - vm.$options._renderChildren = renderChildren; - // update props - if (propsData && vm.$options.props) { - observerState.shouldConvert = false; - if (process.env.NODE_ENV !== 'production') { - observerState.isSettingProps = true; - } - var propKeys = vm.$options._propKeys || []; - for (var i = 0; i < propKeys.length; i++) { - var key = propKeys[i]; - vm[key] = validateProp(key, vm.$options.props, propsData, vm); - } - observerState.shouldConvert = true; - if (process.env.NODE_ENV !== 'production') { - observerState.isSettingProps = false; - } - } - // update listeners - if (listeners) { - var oldListeners = vm.$options._parentListeners; - vm.$options._parentListeners = listeners; - vm._updateListeners(listeners, oldListeners); - } - // resolve slots + force update if has children - if (hasChildren) { - vm.$slots = resolveSlots(renderChildren, vm._renderContext); - vm.$forceUpdate(); - } - }; - - Vue.prototype.$forceUpdate = function () { - var vm = this; - if (vm._watcher) { - vm._watcher.update(); - } - }; - - Vue.prototype.$destroy = function () { - var vm = this; - if (vm._isBeingDestroyed) { - return - } - callHook(vm, 'beforeDestroy'); - vm._isBeingDestroyed = true; - // remove self from parent - var parent = vm.$parent; - if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) { - remove$1(parent.$children, vm); - } - // teardown watchers - if (vm._watcher) { - vm._watcher.teardown(); - } - var i = vm._watchers.length; - while (i--) { - vm._watchers[i].teardown(); - } - // remove reference from data ob - // frozen object may not have observer. - if (vm._data.__ob__) { - vm._data.__ob__.vmCount--; - } - // call the last hook... - vm._isDestroyed = true; - callHook(vm, 'destroyed'); - // turn off all instance listeners. - vm.$off(); - // remove __vue__ reference - if (vm.$el) { - vm.$el.__vue__ = null; - } - // invoke destroy hooks on current rendered tree - vm.__patch__(vm._vnode, null); - }; -} - -function callHook (vm, hook) { - var handlers = vm.$options[hook]; - if (handlers) { - for (var i = 0, j = handlers.length; i < j; i++) { - handlers[i].call(vm); - } - } - vm.$emit('hook:' + hook); -} - -/* */ - -var hooks = { init: init, prepatch: prepatch, insert: insert, destroy: destroy$1 }; -var hooksToMerge = Object.keys(hooks); - -function createComponent ( - Ctor, - data, - context, - children, - tag -) { - if (!Ctor) { - return - } - - if (isObject(Ctor)) { - Ctor = Vue$2.extend(Ctor); - } - - if (typeof Ctor !== 'function') { - if (process.env.NODE_ENV !== 'production') { - warn(("Invalid Component definition: " + (String(Ctor))), context); - } - return - } - - // async component - if (!Ctor.cid) { - if (Ctor.resolved) { - Ctor = Ctor.resolved; - } else { - Ctor = resolveAsyncComponent(Ctor, function () { - // it's ok to queue this on every render because - // $forceUpdate is buffered by the scheduler. - context.$forceUpdate(); - }); - if (!Ctor) { - // return nothing if this is indeed an async component - // wait for the callback to trigger parent update. - return - } - } - } - - data = data || {}; - - // extract props - var propsData = extractProps(data, Ctor); - - // functional component - if (Ctor.options.functional) { - return createFunctionalComponent(Ctor, propsData, data, context, children) - } - - // extract listeners, since these needs to be treated as - // child component listeners instead of DOM listeners - var listeners = data.on; - // replace with listeners with .native modifier - data.on = data.nativeOn; - - if (Ctor.options.abstract) { - // abstract components do not keep anything - // other than props & listeners - data = {}; - } - - // merge component management hooks onto the placeholder node - mergeHooks(data); - - // return a placeholder vnode - var name = Ctor.options.name || tag; - var vnode = new VNode( - ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')), - data, undefined, undefined, undefined, undefined, context, - { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children } - ); - return vnode -} - -function createFunctionalComponent ( - Ctor, - propsData, - data, - context, - children -) { - var props = {}; - var propOptions = Ctor.options.props; - if (propOptions) { - for (var key in propOptions) { - props[key] = validateProp(key, propOptions, propsData); - } - } - var vnode = Ctor.options.render.call( - null, - // ensure the createElement function in functional components - // gets a unique context - this is necessary for correct named slot check - bind$1(createElement, { _self: Object.create(context) }), - { - props: props, - data: data, - parent: context, - children: normalizeChildren(children), - slots: function () { return resolveSlots(children, context); } - } - ); - if (vnode instanceof VNode) { - vnode.functionalContext = context; - if (data.slot) { - (vnode.data || (vnode.data = {})).slot = data.slot; - } - } - return vnode -} - -function createComponentInstanceForVnode ( - vnode, // we know it's MountedComponentVNode but flow doesn't - parent // activeInstance in lifecycle state -) { - var vnodeComponentOptions = vnode.componentOptions; - var options = { - _isComponent: true, - parent: parent, - propsData: vnodeComponentOptions.propsData, - _componentTag: vnodeComponentOptions.tag, - _parentVnode: vnode, - _parentListeners: vnodeComponentOptions.listeners, - _renderChildren: vnodeComponentOptions.children - }; - // check inline-template render functions - var inlineTemplate = vnode.data.inlineTemplate; - if (inlineTemplate) { - options.render = inlineTemplate.render; - options.staticRenderFns = inlineTemplate.staticRenderFns; - } - return new vnodeComponentOptions.Ctor(options) -} - -function init (vnode, hydrating) { - if (!vnode.child || vnode.child._isDestroyed) { - var child = vnode.child = createComponentInstanceForVnode(vnode, activeInstance); - child.$mount(hydrating ? vnode.elm : undefined, hydrating); - } -} - -function prepatch ( - oldVnode, - vnode -) { - var options = vnode.componentOptions; - var child = vnode.child = oldVnode.child; - child._updateFromParent( - options.propsData, // updated props - options.listeners, // updated listeners - vnode, // new parent vnode - options.children // new children - ); -} - -function insert (vnode) { - if (!vnode.child._isMounted) { - vnode.child._isMounted = true; - callHook(vnode.child, 'mounted'); - } - if (vnode.data.keepAlive) { - vnode.child._inactive = false; - callHook(vnode.child, 'activated'); - } -} - -function destroy$1 (vnode) { - if (!vnode.child._isDestroyed) { - if (!vnode.data.keepAlive) { - vnode.child.$destroy(); - } else { - vnode.child._inactive = true; - callHook(vnode.child, 'deactivated'); - } - } -} - -function resolveAsyncComponent ( - factory, - cb -) { - if (factory.requested) { - // pool callbacks - factory.pendingCallbacks.push(cb); - } else { - factory.requested = true; - var cbs = factory.pendingCallbacks = [cb]; - var sync = true; - - var resolve = function (res) { - if (isObject(res)) { - res = Vue$2.extend(res); - } - // cache resolved - factory.resolved = res; - // invoke callbacks only if this is not a synchronous resolve - // (async resolves are shimmed as synchronous during SSR) - if (!sync) { - for (var i = 0, l = cbs.length; i < l; i++) { - cbs[i](res); - } - } - }; - - var reject = function (reason) { - process.env.NODE_ENV !== 'production' && warn( - "Failed to resolve async component: " + (String(factory)) + - (reason ? ("\nReason: " + reason) : '') - ); - }; - - var res = factory(resolve, reject); - - // handle promise - if (res && typeof res.then === 'function' && !factory.resolved) { - res.then(resolve, reject); - } - - sync = false; - // return in case resolved synchronously - return factory.resolved - } -} - -function extractProps (data, Ctor) { - // we are only extrating raw values here. - // validation and default values are handled in the child - // component itself. - var propOptions = Ctor.options.props; - if (!propOptions) { - return - } - var res = {}; - var attrs = data.attrs; - var props = data.props; - var domProps = data.domProps; - if (attrs || props || domProps) { - for (var key in propOptions) { - var altKey = hyphenate(key); - checkProp(res, props, key, altKey, true) || - checkProp(res, attrs, key, altKey) || - checkProp(res, domProps, key, altKey); - } - } - return res -} - -function checkProp ( - res, - hash, - key, - altKey, - preserve -) { - if (hash) { - if (hasOwn(hash, key)) { - res[key] = hash[key]; - if (!preserve) { - delete hash[key]; - } - return true - } else if (hasOwn(hash, altKey)) { - res[key] = hash[altKey]; - if (!preserve) { - delete hash[altKey]; - } - return true - } - } - return false -} - -function mergeHooks (data) { - if (!data.hook) { - data.hook = {}; - } - for (var i = 0; i < hooksToMerge.length; i++) { - var key = hooksToMerge[i]; - var fromParent = data.hook[key]; - var ours = hooks[key]; - data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours; - } -} - -function mergeHook$1 (a, b) { - // since all hooks have at most two args, use fixed args - // to avoid having to use fn.apply(). - return function (_, __) { - a(_, __); - b(_, __); - } -} - -/* */ - -// wrapper function for providing a more flexible interface -// without getting yelled at by flow -function createElement ( - tag, - data, - children -) { - if (data && (Array.isArray(data) || typeof data !== 'object')) { - children = data; - data = undefined; - } - // make sure to use real instance instead of proxy as context - return _createElement(this._self, tag, data, children) -} - -function _createElement ( - context, - tag, - data, - children -) { - if (data && data.__ob__) { - process.env.NODE_ENV !== 'production' && warn( - "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" + - 'Always create fresh vnode data objects in each render!', - context - ); - return - } - if (!tag) { - // in case of component :is set to falsy value - return emptyVNode() - } - if (typeof tag === 'string') { - var Ctor; - var ns = config.getTagNamespace(tag); - if (config.isReservedTag(tag)) { - // platform built-in elements - return new VNode( - tag, data, normalizeChildren(children, ns), - undefined, undefined, ns, context - ) - } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) { - // component - return createComponent(Ctor, data, context, children, tag) - } else { - // unknown or unlisted namespaced elements - // check at runtime because it may get assigned a namespace when its - // parent normalizes children - return new VNode( - tag, data, normalizeChildren(children, ns), - undefined, undefined, ns, context - ) - } - } else { - // direct component options / constructor - return createComponent(tag, data, context, children) - } -} - -/* */ - -function initRender (vm) { - vm.$vnode = null; // the placeholder node in parent tree - vm._vnode = null; // the root of the child tree - vm._staticTrees = null; - vm._renderContext = vm.$options._parentVnode && vm.$options._parentVnode.context; - vm.$slots = resolveSlots(vm.$options._renderChildren, vm._renderContext); - // bind the public createElement fn to this instance - // so that we get proper render context inside it. - vm.$createElement = bind$1(createElement, vm); - if (vm.$options.el) { - vm.$mount(vm.$options.el); - } -} - -function renderMixin (Vue) { - Vue.prototype.$nextTick = function (fn) { - nextTick(fn, this); - }; - - Vue.prototype._render = function () { - var vm = this; - var ref = vm.$options; - var render = ref.render; - var staticRenderFns = ref.staticRenderFns; - var _parentVnode = ref._parentVnode; - - if (vm._isMounted) { - // clone slot nodes on re-renders - for (var key in vm.$slots) { - vm.$slots[key] = cloneVNodes(vm.$slots[key]); - } - } - - if (staticRenderFns && !vm._staticTrees) { - vm._staticTrees = []; - } - // set parent vnode. this allows render functions to have access - // to the data on the placeholder node. - vm.$vnode = _parentVnode; - // render self - var vnode; - try { - vnode = render.call(vm._renderProxy, vm.$createElement); - } catch (e) { - if (process.env.NODE_ENV !== 'production') { - warn(("Error when rendering " + (formatComponentName(vm)) + ":")); - } - /* istanbul ignore else */ - if (config.errorHandler) { - config.errorHandler.call(null, e, vm); - } else { - if (config._isServer) { - throw e - } else { - setTimeout(function () { throw e }, 0); - } - } - // return previous vnode to prevent render error causing blank component - vnode = vm._vnode; - } - // return empty vnode in case the render function errored out - if (!(vnode instanceof VNode)) { - if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) { - warn( - 'Multiple root nodes returned from render function. Render function ' + - 'should return a single root node.', - vm - ); - } - vnode = emptyVNode(); - } - // set parent - vnode.parent = _parentVnode; - return vnode - }; - - // shorthands used in render functions - Vue.prototype._h = createElement; - // toString for mustaches - Vue.prototype._s = _toString; - // number conversion - Vue.prototype._n = toNumber; - // empty vnode - Vue.prototype._e = emptyVNode; - // loose equal - Vue.prototype._q = looseEqual; - // loose indexOf - Vue.prototype._i = looseIndexOf; - - // render static tree by index - Vue.prototype._m = function renderStatic ( - index, - isInFor - ) { - var tree = this._staticTrees[index]; - // if has already-rendered static tree and not inside v-for, - // we can reuse the same tree by doing a shallow clone. - if (tree && !isInFor) { - return Array.isArray(tree) - ? cloneVNodes(tree) - : cloneVNode(tree) - } - // otherwise, render a fresh tree. - tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy); - if (Array.isArray(tree)) { - for (var i = 0; i < tree.length; i++) { - if (typeof tree[i] !== 'string') { - tree[i].isStatic = true; - tree[i].key = "__static__" + index + "_" + i; - } - } - } else { - tree.isStatic = true; - tree.key = "__static__" + index; - } - return tree - }; - - // filter resolution helper - var identity = function (_) { return _; }; - Vue.prototype._f = function resolveFilter (id) { - return resolveAsset(this.$options, 'filters', id, true) || identity - }; - - // render v-for - Vue.prototype._l = function renderList ( - val, - render - ) { - var ret, i, l, keys, key; - if (Array.isArray(val)) { - ret = new Array(val.length); - for (i = 0, l = val.length; i < l; i++) { - ret[i] = render(val[i], i); - } - } else if (typeof val === 'number') { - ret = new Array(val); - for (i = 0; i < val; i++) { - ret[i] = render(i + 1, i); - } - } else if (isObject(val)) { - keys = Object.keys(val); - ret = new Array(keys.length); - for (i = 0, l = keys.length; i < l; i++) { - key = keys[i]; - ret[i] = render(val[key], key, i); - } - } - return ret - }; - - // renderSlot - Vue.prototype._t = function ( - name, - fallback - ) { - var slotNodes = this.$slots[name]; - // warn duplicate slot usage - if (slotNodes && process.env.NODE_ENV !== 'production') { - slotNodes._rendered && warn( - "Duplicate presence of slot \"" + name + "\" found in the same render tree " + - "- this will likely cause render errors.", - this - ); - slotNodes._rendered = true; - } - return slotNodes || fallback - }; - - // apply v-bind object - Vue.prototype._b = function bindProps ( - data, - value, - asProp - ) { - if (value) { - if (!isObject(value)) { - process.env.NODE_ENV !== 'production' && warn( - 'v-bind without argument expects an Object or Array value', - this - ); - } else { - if (Array.isArray(value)) { - value = toObject(value); - } - for (var key in value) { - if (key === 'class' || key === 'style') { - data[key] = value[key]; - } else { - var hash = asProp || config.mustUseProp(key) - ? data.domProps || (data.domProps = {}) - : data.attrs || (data.attrs = {}); - hash[key] = value[key]; - } - } - } - } - return data - }; - - // expose v-on keyCodes - Vue.prototype._k = function getKeyCodes (key) { - return config.keyCodes[key] - }; -} - -function resolveSlots ( - renderChildren, - context -) { - var slots = {}; - if (!renderChildren) { - return slots - } - var children = normalizeChildren(renderChildren) || []; - var defaultSlot = []; - var name, child; - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - // named slots should only be respected if the vnode was rendered in the - // same context. - if ((child.context === context || child.functionalContext === context) && - child.data && (name = child.data.slot)) { - var slot = (slots[name] || (slots[name] = [])); - if (child.tag === 'template') { - slot.push.apply(slot, child.children); - } else { - slot.push(child); - } - } else { - defaultSlot.push(child); - } - } - // ignore single whitespace - if (defaultSlot.length && !( - defaultSlot.length === 1 && - (defaultSlot[0].text === ' ' || defaultSlot[0].isComment) - )) { - slots.default = defaultSlot; - } - return slots -} - -/* */ - -function initEvents (vm) { - vm._events = Object.create(null); - // init parent attached events - var listeners = vm.$options._parentListeners; - var on = bind$1(vm.$on, vm); - var off = bind$1(vm.$off, vm); - vm._updateListeners = function (listeners, oldListeners) { - updateListeners(listeners, oldListeners || {}, on, off, vm); - }; - if (listeners) { - vm._updateListeners(listeners); - } -} - -function eventsMixin (Vue) { - Vue.prototype.$on = function (event, fn) { - var vm = this;(vm._events[event] || (vm._events[event] = [])).push(fn); - return vm - }; - - Vue.prototype.$once = function (event, fn) { - var vm = this; - function on () { - vm.$off(event, on); - fn.apply(vm, arguments); - } - on.fn = fn; - vm.$on(event, on); - return vm - }; - - Vue.prototype.$off = function (event, fn) { - var vm = this; - // all - if (!arguments.length) { - vm._events = Object.create(null); - return vm - } - // specific event - var cbs = vm._events[event]; - if (!cbs) { - return vm - } - if (arguments.length === 1) { - vm._events[event] = null; - return vm - } - // specific handler - var cb; - var i = cbs.length; - while (i--) { - cb = cbs[i]; - if (cb === fn || cb.fn === fn) { - cbs.splice(i, 1); - break - } - } - return vm - }; - - Vue.prototype.$emit = function (event) { - var vm = this; - var cbs = vm._events[event]; - if (cbs) { - cbs = cbs.length > 1 ? toArray(cbs) : cbs; - var args = toArray(arguments, 1); - for (var i = 0, l = cbs.length; i < l; i++) { - cbs[i].apply(vm, args); - } - } - return vm - }; -} - -/* */ - -var uid = 0; - -function initMixin (Vue) { - Vue.prototype._init = function (options) { - var vm = this; - // a uid - vm._uid = uid++; - // a flag to avoid this being observed - vm._isVue = true; - // merge options - if (options && options._isComponent) { - // optimize internal component instantiation - // since dynamic options merging is pretty slow, and none of the - // internal component options needs special treatment. - initInternalComponent(vm, options); - } else { - vm.$options = mergeOptions( - resolveConstructorOptions(vm), - options || {}, - vm - ); - } - /* istanbul ignore else */ - if (process.env.NODE_ENV !== 'production') { - initProxy(vm); - } else { - vm._renderProxy = vm; - } - // expose real self - vm._self = vm; - initLifecycle(vm); - initEvents(vm); - callHook(vm, 'beforeCreate'); - initState(vm); - callHook(vm, 'created'); - initRender(vm); - }; - - function initInternalComponent (vm, options) { - var opts = vm.$options = Object.create(resolveConstructorOptions(vm)); - // doing this because it's faster than dynamic enumeration. - opts.parent = options.parent; - opts.propsData = options.propsData; - opts._parentVnode = options._parentVnode; - opts._parentListeners = options._parentListeners; - opts._renderChildren = options._renderChildren; - opts._componentTag = options._componentTag; - if (options.render) { - opts.render = options.render; - opts.staticRenderFns = options.staticRenderFns; - } - } - - function resolveConstructorOptions (vm) { - var Ctor = vm.constructor; - var options = Ctor.options; - if (Ctor.super) { - var superOptions = Ctor.super.options; - var cachedSuperOptions = Ctor.superOptions; - if (superOptions !== cachedSuperOptions) { - // super option changed - Ctor.superOptions = superOptions; - options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions); - if (options.name) { - options.components[options.name] = Ctor; - } - } - } - return options - } -} - -function Vue$2 (options) { - if (process.env.NODE_ENV !== 'production' && - !(this instanceof Vue$2)) { - warn('Vue is a constructor and should be called with the `new` keyword'); - } - this._init(options); -} - -initMixin(Vue$2); -stateMixin(Vue$2); -eventsMixin(Vue$2); -lifecycleMixin(Vue$2); -renderMixin(Vue$2); - -var warn = noop; -var formatComponentName; - -if (process.env.NODE_ENV !== 'production') { - var hasConsole = typeof console !== 'undefined'; - - warn = function (msg, vm) { - if (hasConsole && (!config.silent)) { - console.error("[Vue warn]: " + msg + " " + ( - vm ? formatLocation(formatComponentName(vm)) : '' - )); - } - }; - - formatComponentName = function (vm) { - if (vm.$root === vm) { - return 'root instance' - } - var name = vm._isVue - ? vm.$options.name || vm.$options._componentTag - : vm.name; - return ( - (name ? ("component <" + name + ">") : "anonymous component") + - (vm._isVue && vm.$options.__file ? (" at " + (vm.$options.__file)) : '') - ) - }; - - var formatLocation = function (str) { - if (str === 'anonymous component') { - str += " - use the \"name\" option for better debugging messages."; - } - return ("\n(found in " + str + ")") - }; -} - -/* */ - -/** - * Option overwriting strategies are functions that handle - * how to merge a parent option value and a child option - * value into the final value. - */ -var strats = config.optionMergeStrategies; - -/** - * Options with restrictions - */ -if (process.env.NODE_ENV !== 'production') { - strats.el = strats.propsData = function (parent, child, vm, key) { - if (!vm) { - warn( - "option \"" + key + "\" can only be used during instance " + - 'creation with the `new` keyword.' - ); - } - return defaultStrat(parent, child) - }; -} - -/** - * Helper that recursively merges two data objects together. - */ -function mergeData (to, from) { - var key, toVal, fromVal; - for (key in from) { - toVal = to[key]; - fromVal = from[key]; - if (!hasOwn(to, key)) { - set(to, key, fromVal); - } else if (isObject(toVal) && isObject(fromVal)) { - mergeData(toVal, fromVal); - } - } - return to -} - -/** - * Data - */ -strats.data = function ( - parentVal, - childVal, - vm -) { - if (!vm) { - // in a Vue.extend merge, both should be functions - if (!childVal) { - return parentVal - } - if (typeof childVal !== 'function') { - process.env.NODE_ENV !== 'production' && warn( - 'The "data" option should be a function ' + - 'that returns a per-instance value in component ' + - 'definitions.', - vm - ); - return parentVal - } - if (!parentVal) { - return childVal - } - // when parentVal & childVal are both present, - // we need to return a function that returns the - // merged result of both functions... no need to - // check if parentVal is a function here because - // it has to be a function to pass previous merges. - return function mergedDataFn () { - return mergeData( - childVal.call(this), - parentVal.call(this) - ) - } - } else if (parentVal || childVal) { - return function mergedInstanceDataFn () { - // instance merge - var instanceData = typeof childVal === 'function' - ? childVal.call(vm) - : childVal; - var defaultData = typeof parentVal === 'function' - ? parentVal.call(vm) - : undefined; - if (instanceData) { - return mergeData(instanceData, defaultData) - } else { - return defaultData - } - } - } -}; - -/** - * Hooks and param attributes are merged as arrays. - */ -function mergeHook ( - parentVal, - childVal -) { - return childVal - ? parentVal - ? parentVal.concat(childVal) - : Array.isArray(childVal) - ? childVal - : [childVal] - : parentVal -} - -config._lifecycleHooks.forEach(function (hook) { - strats[hook] = mergeHook; -}); - -/** - * Assets - * - * When a vm is present (instance creation), we need to do - * a three-way merge between constructor options, instance - * options and parent options. - */ -function mergeAssets (parentVal, childVal) { - var res = Object.create(parentVal || null); - return childVal - ? extend(res, childVal) - : res -} - -config._assetTypes.forEach(function (type) { - strats[type + 's'] = mergeAssets; -}); - -/** - * Watchers. - * - * Watchers hashes should not overwrite one - * another, so we merge them as arrays. - */ -strats.watch = function (parentVal, childVal) { - /* istanbul ignore if */ - if (!childVal) { return parentVal } - if (!parentVal) { return childVal } - var ret = {}; - extend(ret, parentVal); - for (var key in childVal) { - var parent = ret[key]; - var child = childVal[key]; - if (parent && !Array.isArray(parent)) { - parent = [parent]; - } - ret[key] = parent - ? parent.concat(child) - : [child]; - } - return ret -}; - -/** - * Other object hashes. - */ -strats.props = -strats.methods = -strats.computed = function (parentVal, childVal) { - if (!childVal) { return parentVal } - if (!parentVal) { return childVal } - var ret = Object.create(null); - extend(ret, parentVal); - extend(ret, childVal); - return ret -}; - -/** - * Default strategy. - */ -var defaultStrat = function (parentVal, childVal) { - return childVal === undefined - ? parentVal - : childVal -}; - -/** - * Make sure component options get converted to actual - * constructors. - */ -function normalizeComponents (options) { - if (options.components) { - var components = options.components; - var def; - for (var key in components) { - var lower = key.toLowerCase(); - if (isBuiltInTag(lower) || config.isReservedTag(lower)) { - process.env.NODE_ENV !== 'production' && warn( - 'Do not use built-in or reserved HTML elements as component ' + - 'id: ' + key - ); - continue - } - def = components[key]; - if (isPlainObject(def)) { - components[key] = Vue$2.extend(def); - } - } - } -} - -/** - * Ensure all props option syntax are normalized into the - * Object-based format. - */ -function normalizeProps (options) { - var props = options.props; - if (!props) { return } - var res = {}; - var i, val, name; - if (Array.isArray(props)) { - i = props.length; - while (i--) { - val = props[i]; - if (typeof val === 'string') { - name = camelize(val); - res[name] = { type: null }; - } else if (process.env.NODE_ENV !== 'production') { - warn('props must be strings when using array syntax.'); - } - } - } else if (isPlainObject(props)) { - for (var key in props) { - val = props[key]; - name = camelize(key); - res[name] = isPlainObject(val) - ? val - : { type: val }; - } - } - options.props = res; -} - -/** - * Normalize raw function directives into object format. - */ -function normalizeDirectives (options) { - var dirs = options.directives; - if (dirs) { - for (var key in dirs) { - var def = dirs[key]; - if (typeof def === 'function') { - dirs[key] = { bind: def, update: def }; - } - } - } -} - -/** - * Merge two option objects into a new one. - * Core utility used in both instantiation and inheritance. - */ -function mergeOptions ( - parent, - child, - vm -) { - normalizeComponents(child); - normalizeProps(child); - normalizeDirectives(child); - var extendsFrom = child.extends; - if (extendsFrom) { - parent = typeof extendsFrom === 'function' - ? mergeOptions(parent, extendsFrom.options, vm) - : mergeOptions(parent, extendsFrom, vm); - } - if (child.mixins) { - for (var i = 0, l = child.mixins.length; i < l; i++) { - var mixin = child.mixins[i]; - if (mixin.prototype instanceof Vue$2) { - mixin = mixin.options; - } - parent = mergeOptions(parent, mixin, vm); - } - } - var options = {}; - var key; - for (key in parent) { - mergeField(key); - } - for (key in child) { - if (!hasOwn(parent, key)) { - mergeField(key); - } - } - function mergeField (key) { - var strat = strats[key] || defaultStrat; - options[key] = strat(parent[key], child[key], vm, key); - } - return options -} - -/** - * Resolve an asset. - * This function is used because child instances need access - * to assets defined in its ancestor chain. - */ -function resolveAsset ( - options, - type, - id, - warnMissing -) { - /* istanbul ignore if */ - if (typeof id !== 'string') { - return - } - var assets = options[type]; - var res = assets[id] || - // camelCase ID - assets[camelize(id)] || - // Pascal Case ID - assets[capitalize(camelize(id))]; - if (process.env.NODE_ENV !== 'production' && warnMissing && !res) { - warn( - 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, - options - ); - } - return res -} - -/* */ - -function validateProp ( - key, - propOptions, - propsData, - vm -) { - var prop = propOptions[key]; - var absent = !hasOwn(propsData, key); - var value = propsData[key]; - // handle boolean props - if (isBooleanType(prop.type)) { - if (absent && !hasOwn(prop, 'default')) { - value = false; - } else if (value === '' || value === hyphenate(key)) { - value = true; - } - } - // check default value - if (value === undefined) { - value = getPropDefaultValue(vm, prop, key); - // since the default value is a fresh copy, - // make sure to observe it. - var prevShouldConvert = observerState.shouldConvert; - observerState.shouldConvert = true; - observe(value); - observerState.shouldConvert = prevShouldConvert; - } - if (process.env.NODE_ENV !== 'production') { - assertProp(prop, key, value, vm, absent); - } - return value -} - -/** - * Get the default value of a prop. - */ -function getPropDefaultValue (vm, prop, name) { - // no default, return undefined - if (!hasOwn(prop, 'default')) { - return undefined - } - var def = prop.default; - // warn against non-factory defaults for Object & Array - if (isObject(def)) { - process.env.NODE_ENV !== 'production' && warn( - 'Invalid default value for prop "' + name + '": ' + - 'Props with type Object/Array must use a factory function ' + - 'to return the default value.', - vm - ); - } - // call factory function for non-Function types - return typeof def === 'function' && prop.type !== Function - ? def.call(vm) - : def -} - -/** - * Assert whether a prop is valid. - */ -function assertProp ( - prop, - name, - value, - vm, - absent -) { - if (prop.required && absent) { - warn( - 'Missing required prop: "' + name + '"', - vm - ); - return - } - if (value == null && !prop.required) { - return - } - var type = prop.type; - var valid = !type || type === true; - var expectedTypes = []; - if (type) { - if (!Array.isArray(type)) { - type = [type]; - } - for (var i = 0; i < type.length && !valid; i++) { - var assertedType = assertType(value, type[i]); - expectedTypes.push(assertedType.expectedType); - valid = assertedType.valid; - } - } - if (!valid) { - warn( - 'Invalid prop: type check failed for prop "' + name + '".' + - ' Expected ' + expectedTypes.map(capitalize).join(', ') + - ', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.', - vm - ); - return - } - var validator = prop.validator; - if (validator) { - if (!validator(value)) { - warn( - 'Invalid prop: custom validator check failed for prop "' + name + '".', - vm - ); - } - } -} - -/** - * Assert the type of a value - */ -function assertType (value, type) { - var valid; - var expectedType = getType(type); - if (expectedType === 'String') { - valid = typeof value === (expectedType = 'string'); - } else if (expectedType === 'Number') { - valid = typeof value === (expectedType = 'number'); - } else if (expectedType === 'Boolean') { - valid = typeof value === (expectedType = 'boolean'); - } else if (expectedType === 'Function') { - valid = typeof value === (expectedType = 'function'); - } else if (expectedType === 'Object') { - valid = isPlainObject(value); - } else if (expectedType === 'Array') { - valid = Array.isArray(value); - } else { - valid = value instanceof type; - } - return { - valid: valid, - expectedType: expectedType - } -} - -/** - * Use function string name to check built-in types, - * because a simple equality check will fail when running - * across different vms / iframes. - */ -function getType (fn) { - var match = fn && fn.toString().match(/^\s*function (\w+)/); - return match && match[1] -} - -function isBooleanType (fn) { - if (!Array.isArray(fn)) { - return getType(fn) === 'Boolean' - } - for (var i = 0, len = fn.length; i < len; i++) { - if (getType(fn[i]) === 'Boolean') { - return true - } - } - /* istanbul ignore next */ - return false -} - - - -var util = Object.freeze({ - defineReactive: defineReactive$$1, - _toString: _toString, - toNumber: toNumber, - makeMap: makeMap, - isBuiltInTag: isBuiltInTag, - remove: remove$1, - hasOwn: hasOwn, - isPrimitive: isPrimitive, - cached: cached, - camelize: camelize, - capitalize: capitalize, - hyphenate: hyphenate, - bind: bind$1, - toArray: toArray, - extend: extend, - isObject: isObject, - isPlainObject: isPlainObject, - toObject: toObject, - noop: noop, - no: no, - genStaticKeys: genStaticKeys, - looseEqual: looseEqual, - looseIndexOf: looseIndexOf, - isReserved: isReserved, - def: def, - parsePath: parsePath, - hasProto: hasProto, - inBrowser: inBrowser, - UA: UA, - isIE: isIE, - isIE9: isIE9, - isEdge: isEdge, - isAndroid: isAndroid, - isIOS: isIOS, - devtools: devtools, - nextTick: nextTick, - get _Set () { return _Set; }, - mergeOptions: mergeOptions, - resolveAsset: resolveAsset, - get warn () { return warn; }, - get formatComponentName () { return formatComponentName; }, - validateProp: validateProp -}); - -/* */ - -function initUse (Vue) { - Vue.use = function (plugin) { - /* istanbul ignore if */ - if (plugin.installed) { - return - } - // additional parameters - var args = toArray(arguments, 1); - args.unshift(this); - if (typeof plugin.install === 'function') { - plugin.install.apply(plugin, args); - } else { - plugin.apply(null, args); - } - plugin.installed = true; - return this - }; -} - -/* */ - -function initMixin$1 (Vue) { - Vue.mixin = function (mixin) { - Vue.options = mergeOptions(Vue.options, mixin); - }; -} - -/* */ - -function initExtend (Vue) { - /** - * Each instance constructor, including Vue, has a unique - * cid. This enables us to create wrapped "child - * constructors" for prototypal inheritance and cache them. - */ - Vue.cid = 0; - var cid = 1; - - /** - * Class inheritance - */ - Vue.extend = function (extendOptions) { - extendOptions = extendOptions || {}; - var Super = this; - var isFirstExtend = Super.cid === 0; - if (isFirstExtend && extendOptions._Ctor) { - return extendOptions._Ctor - } - var name = extendOptions.name || Super.options.name; - if (process.env.NODE_ENV !== 'production') { - if (!/^[a-zA-Z][\w-]*$/.test(name)) { - warn( - 'Invalid component name: "' + name + '". Component names ' + - 'can only contain alphanumeric characaters and the hyphen.' - ); - name = null; - } - } - var Sub = function VueComponent (options) { - this._init(options); - }; - Sub.prototype = Object.create(Super.prototype); - Sub.prototype.constructor = Sub; - Sub.cid = cid++; - Sub.options = mergeOptions( - Super.options, - extendOptions - ); - Sub['super'] = Super; - // allow further extension - Sub.extend = Super.extend; - // create asset registers, so extended classes - // can have their private assets too. - config._assetTypes.forEach(function (type) { - Sub[type] = Super[type]; - }); - // enable recursive self-lookup - if (name) { - Sub.options.components[name] = Sub; - } - // keep a reference to the super options at extension time. - // later at instantiation we can check if Super's options have - // been updated. - Sub.superOptions = Super.options; - Sub.extendOptions = extendOptions; - // cache constructor - if (isFirstExtend) { - extendOptions._Ctor = Sub; - } - return Sub - }; -} - -/* */ - -function initAssetRegisters (Vue) { - /** - * Create asset registration methods. - */ - config._assetTypes.forEach(function (type) { - Vue[type] = function ( - id, - definition - ) { - if (!definition) { - return this.options[type + 's'][id] - } else { - /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production') { - if (type === 'component' && config.isReservedTag(id)) { - warn( - 'Do not use built-in or reserved HTML elements as component ' + - 'id: ' + id - ); - } - } - if (type === 'component' && isPlainObject(definition)) { - definition.name = definition.name || id; - definition = Vue.extend(definition); - } - if (type === 'directive' && typeof definition === 'function') { - definition = { bind: definition, update: definition }; - } - this.options[type + 's'][id] = definition; - return definition - } - }; - }); -} - -var KeepAlive = { - name: 'keep-alive', - abstract: true, - created: function created () { - this.cache = Object.create(null); - }, - render: function render () { - var vnode = getFirstComponentChild(this.$slots.default); - if (vnode && vnode.componentOptions) { - var opts = vnode.componentOptions; - var key = vnode.key == null - // same constructor may get registered as different local components - // so cid alone is not enough (#3269) - ? opts.Ctor.cid + '::' + opts.tag - : vnode.key; - if (this.cache[key]) { - vnode.child = this.cache[key].child; - } else { - this.cache[key] = vnode; - } - vnode.data.keepAlive = true; - } - return vnode - }, - destroyed: function destroyed () { - var this$1 = this; - - for (var key in this.cache) { - var vnode = this$1.cache[key]; - callHook(vnode.child, 'deactivated'); - vnode.child.$destroy(); - } - } -}; - -var builtInComponents = { - KeepAlive: KeepAlive -}; - -/* */ - -function initGlobalAPI (Vue) { - // config - var configDef = {}; - configDef.get = function () { return config; }; - if (process.env.NODE_ENV !== 'production') { - configDef.set = function () { - warn( - 'Do not replace the Vue.config object, set individual fields instead.' - ); - }; - } - Object.defineProperty(Vue, 'config', configDef); - Vue.util = util; - Vue.set = set; - Vue.delete = del; - Vue.nextTick = nextTick; - - Vue.options = Object.create(null); - config._assetTypes.forEach(function (type) { - Vue.options[type + 's'] = Object.create(null); - }); - - extend(Vue.options.components, builtInComponents); - - initUse(Vue); - initMixin$1(Vue); - initExtend(Vue); - initAssetRegisters(Vue); -} - -initGlobalAPI(Vue$2); - -Object.defineProperty(Vue$2.prototype, '$isServer', { - get: function () { return config._isServer; } -}); - -Vue$2.version = '2.0.3'; - -/* */ - -// attributes that should be using props for binding -var mustUseProp = makeMap('value,selected,checked,muted'); - -var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck'); - -var isBooleanAttr = makeMap( - 'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' + - 'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' + - 'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' + - 'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' + - 'required,reversed,scoped,seamless,selected,sortable,translate,' + - 'truespeed,typemustmatch,visible' -); - -var isAttr = makeMap( - 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' + - 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' + - 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' + - 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' + - 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' + - 'form,formaction,headers,<th>,height,hidden,high,href,hreflang,http-equiv,' + - 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' + - 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' + - 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' + - 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' + - 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' + - 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' + - 'target,title,type,usemap,value,width,wrap' -); - - - -var xlinkNS = 'http://www.w3.org/1999/xlink'; - -var isXlink = function (name) { - return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink' -}; - -var getXlinkProp = function (name) { - return isXlink(name) ? name.slice(6, name.length) : '' -}; - -var isFalsyAttrValue = function (val) { - return val == null || val === false -}; - -/* */ - -function genClassForVnode (vnode) { - var data = vnode.data; - var parentNode = vnode; - var childNode = vnode; - while (childNode.child) { - childNode = childNode.child._vnode; - if (childNode.data) { - data = mergeClassData(childNode.data, data); - } - } - while ((parentNode = parentNode.parent)) { - if (parentNode.data) { - data = mergeClassData(data, parentNode.data); - } - } - return genClassFromData(data) -} - -function mergeClassData (child, parent) { - return { - staticClass: concat(child.staticClass, parent.staticClass), - class: child.class - ? [child.class, parent.class] - : parent.class - } -} - -function genClassFromData (data) { - var dynamicClass = data.class; - var staticClass = data.staticClass; - if (staticClass || dynamicClass) { - return concat(staticClass, stringifyClass(dynamicClass)) - } - /* istanbul ignore next */ - return '' -} - -function concat (a, b) { - return a ? b ? (a + ' ' + b) : a : (b || '') -} - -function stringifyClass (value) { - var res = ''; - if (!value) { - return res - } - if (typeof value === 'string') { - return value - } - if (Array.isArray(value)) { - var stringified; - for (var i = 0, l = value.length; i < l; i++) { - if (value[i]) { - if ((stringified = stringifyClass(value[i]))) { - res += stringified + ' '; - } - } - } - return res.slice(0, -1) - } - if (isObject(value)) { - for (var key in value) { - if (value[key]) { res += key + ' '; } - } - return res.slice(0, -1) - } - /* istanbul ignore next */ - return res -} - -/* */ - -var namespaceMap = { - svg: 'http://www.w3.org/2000/svg', - math: 'http://www.w3.org/1998/Math/MathML' -}; - -var isHTMLTag = makeMap( - 'html,body,base,head,link,meta,style,title,' + - 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' + - 'div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,' + - 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' + - 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' + - 'embed,object,param,source,canvas,script,noscript,del,ins,' + - 'caption,col,colgroup,table,thead,tbody,td,th,tr,' + - 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' + - 'output,progress,select,textarea,' + - 'details,dialog,menu,menuitem,summary,' + - 'content,element,shadow,template' -); - -var isUnaryTag = makeMap( - 'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' + - 'link,meta,param,source,track,wbr', - true -); - -// Elements that you can, intentionally, leave open -// (and which close themselves) -var canBeLeftOpenTag = makeMap( - 'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source', - true -); - -// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3 -// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content -var isNonPhrasingTag = makeMap( - 'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' + - 'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' + - 'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' + - 'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' + - 'title,tr,track', - true -); - -// this map is intentionally selective, only covering SVG elements that may -// contain child elements. -var isSVG = makeMap( - 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font,' + - 'font-face,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' + - 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view', - true -); - - - -var isReservedTag = function (tag) { - return isHTMLTag(tag) || isSVG(tag) -}; - -function getTagNamespace (tag) { - if (isSVG(tag)) { - return 'svg' - } - // basic support for MathML - // note it doesn't support other MathML elements being component roots - if (tag === 'math') { - return 'math' - } -} - -var unknownElementCache = Object.create(null); -function isUnknownElement (tag) { - /* istanbul ignore if */ - if (!inBrowser) { - return true - } - if (isReservedTag(tag)) { - return false - } - tag = tag.toLowerCase(); - /* istanbul ignore if */ - if (unknownElementCache[tag] != null) { - return unknownElementCache[tag] - } - var el = document.createElement(tag); - if (tag.indexOf('-') > -1) { - // http://stackoverflow.com/a/28210364/1070244 - return (unknownElementCache[tag] = ( - el.constructor === window.HTMLUnknownElement || - el.constructor === window.HTMLElement - )) - } else { - return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString())) - } -} - -/* */ - -/** - * Query an element selector if it's not an element already. - */ -function query (el) { - if (typeof el === 'string') { - var selector = el; - el = document.querySelector(el); - if (!el) { - process.env.NODE_ENV !== 'production' && warn( - 'Cannot find element: ' + selector - ); - return document.createElement('div') - } - } - return el -} - -/* */ - -function createElement$1 (tagName, vnode) { - var elm = document.createElement(tagName); - if (tagName !== 'select') { - return elm - } - if (vnode.data && vnode.data.attrs && 'multiple' in vnode.data.attrs) { - elm.setAttribute('multiple', 'multiple'); - } - return elm -} - -function createElementNS (namespace, tagName) { - return document.createElementNS(namespaceMap[namespace], tagName) -} - -function createTextNode (text) { - return document.createTextNode(text) -} - -function createComment (text) { - return document.createComment(text) -} - -function insertBefore (parentNode, newNode, referenceNode) { - parentNode.insertBefore(newNode, referenceNode); -} - -function removeChild (node, child) { - node.removeChild(child); -} - -function appendChild (node, child) { - node.appendChild(child); -} - -function parentNode (node) { - return node.parentNode -} - -function nextSibling (node) { - return node.nextSibling -} - -function tagName (node) { - return node.tagName -} - -function setTextContent (node, text) { - node.textContent = text; -} - -function childNodes (node) { - return node.childNodes -} - -function setAttribute (node, key, val) { - node.setAttribute(key, val); -} - - -var nodeOps = Object.freeze({ - createElement: createElement$1, - createElementNS: createElementNS, - createTextNode: createTextNode, - createComment: createComment, - insertBefore: insertBefore, - removeChild: removeChild, - appendChild: appendChild, - parentNode: parentNode, - nextSibling: nextSibling, - tagName: tagName, - setTextContent: setTextContent, - childNodes: childNodes, - setAttribute: setAttribute -}); - -/* */ - -var ref = { - create: function create (_, vnode) { - registerRef(vnode); - }, - update: function update (oldVnode, vnode) { - if (oldVnode.data.ref !== vnode.data.ref) { - registerRef(oldVnode, true); - registerRef(vnode); - } - }, - destroy: function destroy (vnode) { - registerRef(vnode, true); - } -}; - -function registerRef (vnode, isRemoval) { - var key = vnode.data.ref; - if (!key) { return } - - var vm = vnode.context; - var ref = vnode.child || vnode.elm; - var refs = vm.$refs; - if (isRemoval) { - if (Array.isArray(refs[key])) { - remove$1(refs[key], ref); - } else if (refs[key] === ref) { - refs[key] = undefined; - } - } else { - if (vnode.data.refInFor) { - if (Array.isArray(refs[key])) { - refs[key].push(ref); - } else { - refs[key] = [ref]; - } - } else { - refs[key] = ref; - } - } -} - -/** - * Virtual DOM patching algorithm based on Snabbdom by - * Simon Friis Vindum (@paldepind) - * Licensed under the MIT License - * https://github.com/paldepind/snabbdom/blob/master/LICENSE - * - * modified by Evan You (@yyx990803) - * - -/* - * Not type-checking this because this file is perf-critical and the cost - * of making flow understand it is not worth it. - */ - -var emptyNode = new VNode('', {}, []); - -var hooks$1 = ['create', 'update', 'remove', 'destroy']; - -function isUndef (s) { - return s == null -} - -function isDef (s) { - return s != null -} - -function sameVnode (vnode1, vnode2) { - return ( - vnode1.key === vnode2.key && - vnode1.tag === vnode2.tag && - vnode1.isComment === vnode2.isComment && - !vnode1.data === !vnode2.data - ) -} - -function createKeyToOldIdx (children, beginIdx, endIdx) { - var i, key; - var map = {}; - for (i = beginIdx; i <= endIdx; ++i) { - key = children[i].key; - if (isDef(key)) { map[key] = i; } - } - return map -} - -function createPatchFunction (backend) { - var i, j; - var cbs = {}; - - var modules = backend.modules; - var nodeOps = backend.nodeOps; - - for (i = 0; i < hooks$1.length; ++i) { - cbs[hooks$1[i]] = []; - for (j = 0; j < modules.length; ++j) { - if (modules[j][hooks$1[i]] !== undefined) { cbs[hooks$1[i]].push(modules[j][hooks$1[i]]); } - } - } - - function emptyNodeAt (elm) { - return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm) - } - - function createRmCb (childElm, listeners) { - function remove$$1 () { - if (--remove$$1.listeners === 0) { - removeElement(childElm); - } - } - remove$$1.listeners = listeners; - return remove$$1 - } - - function removeElement (el) { - var parent = nodeOps.parentNode(el); - nodeOps.removeChild(parent, el); - } - - function createElm (vnode, insertedVnodeQueue, nested) { - var i; - var data = vnode.data; - vnode.isRootInsert = !nested; - if (isDef(data)) { - if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode); } - // after calling the init hook, if the vnode is a child component - // it should've created a child instance and mounted it. the child - // component also has set the placeholder vnode's elm. - // in that case we can just return the element and be done. - if (isDef(i = vnode.child)) { - initComponent(vnode, insertedVnodeQueue); - return vnode.elm - } - } - var children = vnode.children; - var tag = vnode.tag; - if (isDef(tag)) { - if (process.env.NODE_ENV !== 'production') { - if ( - !vnode.ns && - !(config.ignoredElements && config.ignoredElements.indexOf(tag) > -1) && - config.isUnknownElement(tag) - ) { - warn( - 'Unknown custom element: <' + tag + '> - did you ' + - 'register the component correctly? For recursive components, ' + - 'make sure to provide the "name" option.', - vnode.context - ); - } - } - vnode.elm = vnode.ns - ? nodeOps.createElementNS(vnode.ns, tag) - : nodeOps.createElement(tag, vnode); - setScope(vnode); - createChildren(vnode, children, insertedVnodeQueue); - if (isDef(data)) { - invokeCreateHooks(vnode, insertedVnodeQueue); - } - } else if (vnode.isComment) { - vnode.elm = nodeOps.createComment(vnode.text); - } else { - vnode.elm = nodeOps.createTextNode(vnode.text); - } - return vnode.elm - } - - function createChildren (vnode, children, insertedVnodeQueue) { - if (Array.isArray(children)) { - for (var i = 0; i < children.length; ++i) { - nodeOps.appendChild(vnode.elm, createElm(children[i], insertedVnodeQueue, true)); - } - } else if (isPrimitive(vnode.text)) { - nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(vnode.text)); - } - } - - function isPatchable (vnode) { - while (vnode.child) { - vnode = vnode.child._vnode; - } - return isDef(vnode.tag) - } - - function invokeCreateHooks (vnode, insertedVnodeQueue) { - for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) { - cbs.create[i$1](emptyNode, vnode); - } - i = vnode.data.hook; // Reuse variable - if (isDef(i)) { - if (i.create) { i.create(emptyNode, vnode); } - if (i.insert) { insertedVnodeQueue.push(vnode); } - } - } - - function initComponent (vnode, insertedVnodeQueue) { - if (vnode.data.pendingInsert) { - insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert); - } - vnode.elm = vnode.child.$el; - if (isPatchable(vnode)) { - invokeCreateHooks(vnode, insertedVnodeQueue); - setScope(vnode); - } else { - // empty component root. - // skip all element-related modules except for ref (#3455) - registerRef(vnode); - // make sure to invoke the insert hook - insertedVnodeQueue.push(vnode); - } - } - - // set scope id attribute for scoped CSS. - // this is implemented as a special case to avoid the overhead - // of going through the normal attribute patching process. - function setScope (vnode) { - var i; - if (isDef(i = vnode.context) && isDef(i = i.$options._scopeId)) { - nodeOps.setAttribute(vnode.elm, i, ''); - } - if (isDef(i = activeInstance) && - i !== vnode.context && - isDef(i = i.$options._scopeId)) { - nodeOps.setAttribute(vnode.elm, i, ''); - } - } - - function addVnodes (parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) { - for (; startIdx <= endIdx; ++startIdx) { - nodeOps.insertBefore(parentElm, createElm(vnodes[startIdx], insertedVnodeQueue), before); - } - } - - function invokeDestroyHook (vnode) { - var i, j; - var data = vnode.data; - if (isDef(data)) { - if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); } - for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); } - } - if (isDef(i = vnode.children)) { - for (j = 0; j < vnode.children.length; ++j) { - invokeDestroyHook(vnode.children[j]); - } - } - } - - function removeVnodes (parentElm, vnodes, startIdx, endIdx) { - for (; startIdx <= endIdx; ++startIdx) { - var ch = vnodes[startIdx]; - if (isDef(ch)) { - if (isDef(ch.tag)) { - removeAndInvokeRemoveHook(ch); - invokeDestroyHook(ch); - } else { // Text node - nodeOps.removeChild(parentElm, ch.elm); - } - } - } - } - - function removeAndInvokeRemoveHook (vnode, rm) { - if (rm || isDef(vnode.data)) { - var listeners = cbs.remove.length + 1; - if (!rm) { - // directly removing - rm = createRmCb(vnode.elm, listeners); - } else { - // we have a recursively passed down rm callback - // increase the listeners count - rm.listeners += listeners; - } - // recursively invoke hooks on child component root node - if (isDef(i = vnode.child) && isDef(i = i._vnode) && isDef(i.data)) { - removeAndInvokeRemoveHook(i, rm); - } - for (i = 0; i < cbs.remove.length; ++i) { - cbs.remove[i](vnode, rm); - } - if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) { - i(vnode, rm); - } else { - rm(); - } - } else { - removeElement(vnode.elm); - } - } - - function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) { - var oldStartIdx = 0; - var newStartIdx = 0; - var oldEndIdx = oldCh.length - 1; - var oldStartVnode = oldCh[0]; - var oldEndVnode = oldCh[oldEndIdx]; - var newEndIdx = newCh.length - 1; - var newStartVnode = newCh[0]; - var newEndVnode = newCh[newEndIdx]; - var oldKeyToIdx, idxInOld, elmToMove, before; - - // removeOnly is a special flag used only by <transition-group> - // to ensure removed elements stay in correct relative positions - // during leaving transitions - var canMove = !removeOnly; - - while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { - if (isUndef(oldStartVnode)) { - oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left - } else if (isUndef(oldEndVnode)) { - oldEndVnode = oldCh[--oldEndIdx]; - } else if (sameVnode(oldStartVnode, newStartVnode)) { - patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue); - oldStartVnode = oldCh[++oldStartIdx]; - newStartVnode = newCh[++newStartIdx]; - } else if (sameVnode(oldEndVnode, newEndVnode)) { - patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue); - oldEndVnode = oldCh[--oldEndIdx]; - newEndVnode = newCh[--newEndIdx]; - } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right - patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue); - canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm)); - oldStartVnode = oldCh[++oldStartIdx]; - newEndVnode = newCh[--newEndIdx]; - } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left - patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue); - canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm); - oldEndVnode = oldCh[--oldEndIdx]; - newStartVnode = newCh[++newStartIdx]; - } else { - if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); } - idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null; - if (isUndef(idxInOld)) { // New element - nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm); - newStartVnode = newCh[++newStartIdx]; - } else { - elmToMove = oldCh[idxInOld]; - /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production' && !elmToMove) { - warn( - 'It seems there are duplicate keys that is causing an update error. ' + - 'Make sure each v-for item has a unique key.' - ); - } - if (elmToMove.tag !== newStartVnode.tag) { - // same key but different element. treat as new element - nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm); - newStartVnode = newCh[++newStartIdx]; - } else { - patchVnode(elmToMove, newStartVnode, insertedVnodeQueue); - oldCh[idxInOld] = undefined; - canMove && nodeOps.insertBefore(parentElm, newStartVnode.elm, oldStartVnode.elm); - newStartVnode = newCh[++newStartIdx]; - } - } - } - } - if (oldStartIdx > oldEndIdx) { - before = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm; - addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue); - } else if (newStartIdx > newEndIdx) { - removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); - } - } - - function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) { - if (oldVnode === vnode) { - return - } - // reuse element for static trees. - // note we only do this if the vnode is cloned - - // if the new node is not cloned it means the render functions have been - // reset by the hot-reload-api and we need to do a proper re-render. - if (vnode.isStatic && - oldVnode.isStatic && - vnode.key === oldVnode.key && - vnode.isCloned) { - vnode.elm = oldVnode.elm; - return - } - var i; - var data = vnode.data; - var hasData = isDef(data); - if (hasData && isDef(i = data.hook) && isDef(i = i.prepatch)) { - i(oldVnode, vnode); - } - var elm = vnode.elm = oldVnode.elm; - var oldCh = oldVnode.children; - var ch = vnode.children; - if (hasData && isPatchable(vnode)) { - for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); } - if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); } - } - if (isUndef(vnode.text)) { - if (isDef(oldCh) && isDef(ch)) { - if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); } - } else if (isDef(ch)) { - if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); } - addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue); - } else if (isDef(oldCh)) { - removeVnodes(elm, oldCh, 0, oldCh.length - 1); - } else if (isDef(oldVnode.text)) { - nodeOps.setTextContent(elm, ''); - } - } else if (oldVnode.text !== vnode.text) { - nodeOps.setTextContent(elm, vnode.text); - } - if (hasData) { - if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); } - } - } - - function invokeInsertHook (vnode, queue, initial) { - // delay insert hooks for component root nodes, invoke them after the - // element is really inserted - if (initial && vnode.parent) { - vnode.parent.data.pendingInsert = queue; - } else { - for (var i = 0; i < queue.length; ++i) { - queue[i].data.hook.insert(queue[i]); - } - } - } - - var bailed = false; - function hydrate (elm, vnode, insertedVnodeQueue) { - if (process.env.NODE_ENV !== 'production') { - if (!assertNodeMatch(elm, vnode)) { - return false - } - } - vnode.elm = elm; - var tag = vnode.tag; - var data = vnode.data; - var children = vnode.children; - if (isDef(data)) { - if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); } - if (isDef(i = vnode.child)) { - // child component. it should have hydrated its own tree. - initComponent(vnode, insertedVnodeQueue); - return true - } - } - if (isDef(tag)) { - if (isDef(children)) { - var childNodes = nodeOps.childNodes(elm); - // empty element, allow client to pick up and populate children - if (!childNodes.length) { - createChildren(vnode, children, insertedVnodeQueue); - } else { - var childrenMatch = true; - if (childNodes.length !== children.length) { - childrenMatch = false; - } else { - for (var i$1 = 0; i$1 < children.length; i$1++) { - if (!hydrate(childNodes[i$1], children[i$1], insertedVnodeQueue)) { - childrenMatch = false; - break - } - } - } - if (!childrenMatch) { - if (process.env.NODE_ENV !== 'production' && - typeof console !== 'undefined' && - !bailed) { - bailed = true; - console.warn('Parent: ', elm); - console.warn('Mismatching childNodes vs. VNodes: ', childNodes, children); - } - return false - } - } - } - if (isDef(data)) { - invokeCreateHooks(vnode, insertedVnodeQueue); - } - } - return true - } - - function assertNodeMatch (node, vnode) { - if (vnode.tag) { - return ( - vnode.tag.indexOf('vue-component') === 0 || - vnode.tag === nodeOps.tagName(node).toLowerCase() - ) - } else { - return _toString(vnode.text) === node.data - } - } - - return function patch (oldVnode, vnode, hydrating, removeOnly) { - if (!vnode) { - if (oldVnode) { invokeDestroyHook(oldVnode); } - return - } - - var elm, parent; - var isInitialPatch = false; - var insertedVnodeQueue = []; - - if (!oldVnode) { - // empty mount, create new root element - isInitialPatch = true; - createElm(vnode, insertedVnodeQueue); - } else { - var isRealElement = isDef(oldVnode.nodeType); - if (!isRealElement && sameVnode(oldVnode, vnode)) { - patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly); - } else { - if (isRealElement) { - // mounting to a real element - // check if this is server-rendered content and if we can perform - // a successful hydration. - if (oldVnode.nodeType === 1 && oldVnode.hasAttribute('server-rendered')) { - oldVnode.removeAttribute('server-rendered'); - hydrating = true; - } - if (hydrating) { - if (hydrate(oldVnode, vnode, insertedVnodeQueue)) { - invokeInsertHook(vnode, insertedVnodeQueue, true); - return oldVnode - } else if (process.env.NODE_ENV !== 'production') { - warn( - 'The client-side rendered virtual DOM tree is not matching ' + - 'server-rendered content. This is likely caused by incorrect ' + - 'HTML markup, for example nesting block-level elements inside ' + - '<p>, or missing <tbody>. Bailing hydration and performing ' + - 'full client-side render.' - ); - } - } - // either not server-rendered, or hydration failed. - // create an empty node and replace it - oldVnode = emptyNodeAt(oldVnode); - } - elm = oldVnode.elm; - parent = nodeOps.parentNode(elm); - - createElm(vnode, insertedVnodeQueue); - - // component root element replaced. - // update parent placeholder node element. - if (vnode.parent) { - vnode.parent.elm = vnode.elm; - if (isPatchable(vnode)) { - for (var i = 0; i < cbs.create.length; ++i) { - cbs.create[i](emptyNode, vnode.parent); - } - } - } - - if (parent !== null) { - nodeOps.insertBefore(parent, vnode.elm, nodeOps.nextSibling(elm)); - removeVnodes(parent, [oldVnode], 0, 0); - } else if (isDef(oldVnode.tag)) { - invokeDestroyHook(oldVnode); - } - } - } - - invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch); - return vnode.elm - } -} - -/* */ - -var directives = { - create: updateDirectives, - update: updateDirectives, - destroy: function unbindDirectives (vnode) { - updateDirectives(vnode, emptyNode); - } -}; - -function updateDirectives ( - oldVnode, - vnode -) { - if (!oldVnode.data.directives && !vnode.data.directives) { - return - } - var isCreate = oldVnode === emptyNode; - var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context); - var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context); - - var dirsWithInsert = []; - var dirsWithPostpatch = []; - - var key, oldDir, dir; - for (key in newDirs) { - oldDir = oldDirs[key]; - dir = newDirs[key]; - if (!oldDir) { - // new directive, bind - callHook$1(dir, 'bind', vnode, oldVnode); - if (dir.def && dir.def.inserted) { - dirsWithInsert.push(dir); - } - } else { - // existing directive, update - dir.oldValue = oldDir.value; - callHook$1(dir, 'update', vnode, oldVnode); - if (dir.def && dir.def.componentUpdated) { - dirsWithPostpatch.push(dir); - } - } - } - - if (dirsWithInsert.length) { - var callInsert = function () { - dirsWithInsert.forEach(function (dir) { - callHook$1(dir, 'inserted', vnode, oldVnode); - }); - }; - if (isCreate) { - mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', callInsert, 'dir-insert'); - } else { - callInsert(); - } - } - - if (dirsWithPostpatch.length) { - mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'postpatch', function () { - dirsWithPostpatch.forEach(function (dir) { - callHook$1(dir, 'componentUpdated', vnode, oldVnode); - }); - }, 'dir-postpatch'); - } - - if (!isCreate) { - for (key in oldDirs) { - if (!newDirs[key]) { - // no longer present, unbind - callHook$1(oldDirs[key], 'unbind', oldVnode); - } - } - } -} - -var emptyModifiers = Object.create(null); - -function normalizeDirectives$1 ( - dirs, - vm -) { - var res = Object.create(null); - if (!dirs) { - return res - } - var i, dir; - for (i = 0; i < dirs.length; i++) { - dir = dirs[i]; - if (!dir.modifiers) { - dir.modifiers = emptyModifiers; - } - res[getRawDirName(dir)] = dir; - dir.def = resolveAsset(vm.$options, 'directives', dir.name, true); - } - return res -} - -function getRawDirName (dir) { - return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.'))) -} - -function callHook$1 (dir, hook, vnode, oldVnode) { - var fn = dir.def && dir.def[hook]; - if (fn) { - fn(vnode.elm, dir, vnode, oldVnode); - } -} - -var baseModules = [ - ref, - directives -]; - -/* */ - -function updateAttrs (oldVnode, vnode) { - if (!oldVnode.data.attrs && !vnode.data.attrs) { - return - } - var key, cur, old; - var elm = vnode.elm; - var oldAttrs = oldVnode.data.attrs || {}; - var attrs = vnode.data.attrs || {}; - // clone observed objects, as the user probably wants to mutate it - if (attrs.__ob__) { - attrs = vnode.data.attrs = extend({}, attrs); - } - - for (key in attrs) { - cur = attrs[key]; - old = oldAttrs[key]; - if (old !== cur) { - setAttr(elm, key, cur); - } - } - for (key in oldAttrs) { - if (attrs[key] == null) { - if (isXlink(key)) { - elm.removeAttributeNS(xlinkNS, getXlinkProp(key)); - } else if (!isEnumeratedAttr(key)) { - elm.removeAttribute(key); - } - } - } -} - -function setAttr (el, key, value) { - if (isBooleanAttr(key)) { - // set attribute for blank value - // e.g. <option disabled>Select one</option> - if (isFalsyAttrValue(value)) { - el.removeAttribute(key); - } else { - el.setAttribute(key, key); - } - } else if (isEnumeratedAttr(key)) { - el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true'); - } else if (isXlink(key)) { - if (isFalsyAttrValue(value)) { - el.removeAttributeNS(xlinkNS, getXlinkProp(key)); - } else { - el.setAttributeNS(xlinkNS, key, value); - } - } else { - if (isFalsyAttrValue(value)) { - el.removeAttribute(key); - } else { - el.setAttribute(key, value); - } - } -} - -var attrs = { - create: updateAttrs, - update: updateAttrs -}; - -/* */ - -function updateClass (oldVnode, vnode) { - var el = vnode.elm; - var data = vnode.data; - var oldData = oldVnode.data; - if (!data.staticClass && !data.class && - (!oldData || (!oldData.staticClass && !oldData.class))) { - return - } - - var cls = genClassForVnode(vnode); - - // handle transition classes - var transitionClass = el._transitionClasses; - if (transitionClass) { - cls = concat(cls, stringifyClass(transitionClass)); - } - - // set the class - if (cls !== el._prevClass) { - el.setAttribute('class', cls); - el._prevClass = cls; - } -} - -var klass = { - create: updateClass, - update: updateClass -}; - -// skip type checking this file because we need to attach private properties -// to elements - -function updateDOMListeners (oldVnode, vnode) { - if (!oldVnode.data.on && !vnode.data.on) { - return - } - var on = vnode.data.on || {}; - var oldOn = oldVnode.data.on || {}; - var add = vnode.elm._v_add || (vnode.elm._v_add = function (event, handler, capture) { - vnode.elm.addEventListener(event, handler, capture); - }); - var remove = vnode.elm._v_remove || (vnode.elm._v_remove = function (event, handler) { - vnode.elm.removeEventListener(event, handler); - }); - updateListeners(on, oldOn, add, remove, vnode.context); -} - -var events = { - create: updateDOMListeners, - update: updateDOMListeners -}; - -/* */ - -function updateDOMProps (oldVnode, vnode) { - if (!oldVnode.data.domProps && !vnode.data.domProps) { - return - } - var key, cur; - var elm = vnode.elm; - var oldProps = oldVnode.data.domProps || {}; - var props = vnode.data.domProps || {}; - // clone observed objects, as the user probably wants to mutate it - if (props.__ob__) { - props = vnode.data.domProps = extend({}, props); - } - - for (key in oldProps) { - if (props[key] == null) { - elm[key] = undefined; - } - } - for (key in props) { - // ignore children if the node has textContent or innerHTML, - // as these will throw away existing DOM nodes and cause removal errors - // on subsequent patches (#3360) - if ((key === 'textContent' || key === 'innerHTML') && vnode.children) { - vnode.children.length = 0; - } - cur = props[key]; - if (key === 'value') { - // store value as _value as well since - // non-string values will be stringified - elm._value = cur; - // avoid resetting cursor position when value is the same - var strCur = cur == null ? '' : String(cur); - if (elm.value !== strCur && !elm.composing) { - elm.value = strCur; - } - } else { - elm[key] = cur; - } - } -} - -var domProps = { - create: updateDOMProps, - update: updateDOMProps -}; - -/* */ - -var prefixes = ['Webkit', 'Moz', 'ms']; - -var testEl; -var normalize = cached(function (prop) { - testEl = testEl || document.createElement('div'); - prop = camelize(prop); - if (prop !== 'filter' && (prop in testEl.style)) { - return prop - } - var upper = prop.charAt(0).toUpperCase() + prop.slice(1); - for (var i = 0; i < prefixes.length; i++) { - var prefixed = prefixes[i] + upper; - if (prefixed in testEl.style) { - return prefixed - } - } -}); - -function updateStyle (oldVnode, vnode) { - if ((!oldVnode.data || !oldVnode.data.style) && !vnode.data.style) { - return - } - var cur, name; - var el = vnode.elm; - var oldStyle = oldVnode.data.style || {}; - var style = vnode.data.style || {}; - - // handle string - if (typeof style === 'string') { - el.style.cssText = style; - return - } - - var needClone = style.__ob__; - - // handle array syntax - if (Array.isArray(style)) { - style = vnode.data.style = toObject(style); - } - - // clone the style for future updates, - // in case the user mutates the style object in-place. - if (needClone) { - style = vnode.data.style = extend({}, style); - } - - for (name in oldStyle) { - if (style[name] == null) { - el.style[normalize(name)] = ''; - } - } - for (name in style) { - cur = style[name]; - if (cur !== oldStyle[name]) { - // ie9 setting to null has no effect, must use empty string - el.style[normalize(name)] = cur == null ? '' : cur; - } - } -} - -var style = { - create: updateStyle, - update: updateStyle -}; - -/* */ - -/** - * Add class with compatibility for SVG since classList is not supported on - * SVG elements in IE - */ -function addClass (el, cls) { - /* istanbul ignore else */ - if (el.classList) { - if (cls.indexOf(' ') > -1) { - cls.split(/\s+/).forEach(function (c) { return el.classList.add(c); }); - } else { - el.classList.add(cls); - } - } else { - var cur = ' ' + el.getAttribute('class') + ' '; - if (cur.indexOf(' ' + cls + ' ') < 0) { - el.setAttribute('class', (cur + cls).trim()); - } - } -} - -/** - * Remove class with compatibility for SVG since classList is not supported on - * SVG elements in IE - */ -function removeClass (el, cls) { - /* istanbul ignore else */ - if (el.classList) { - if (cls.indexOf(' ') > -1) { - cls.split(/\s+/).forEach(function (c) { return el.classList.remove(c); }); - } else { - el.classList.remove(cls); - } - } else { - var cur = ' ' + el.getAttribute('class') + ' '; - var tar = ' ' + cls + ' '; - while (cur.indexOf(tar) >= 0) { - cur = cur.replace(tar, ' '); - } - el.setAttribute('class', cur.trim()); - } -} - -/* */ - -var hasTransition = inBrowser && !isIE9; -var TRANSITION = 'transition'; -var ANIMATION = 'animation'; - -// Transition property/event sniffing -var transitionProp = 'transition'; -var transitionEndEvent = 'transitionend'; -var animationProp = 'animation'; -var animationEndEvent = 'animationend'; -if (hasTransition) { - /* istanbul ignore if */ - if (window.ontransitionend === undefined && - window.onwebkittransitionend !== undefined) { - transitionProp = 'WebkitTransition'; - transitionEndEvent = 'webkitTransitionEnd'; - } - if (window.onanimationend === undefined && - window.onwebkitanimationend !== undefined) { - animationProp = 'WebkitAnimation'; - animationEndEvent = 'webkitAnimationEnd'; - } -} - -var raf = (inBrowser && window.requestAnimationFrame) || setTimeout; -function nextFrame (fn) { - raf(function () { - raf(fn); - }); -} - -function addTransitionClass (el, cls) { - (el._transitionClasses || (el._transitionClasses = [])).push(cls); - addClass(el, cls); -} - -function removeTransitionClass (el, cls) { - if (el._transitionClasses) { - remove$1(el._transitionClasses, cls); - } - removeClass(el, cls); -} - -function whenTransitionEnds ( - el, - expectedType, - cb -) { - var ref = getTransitionInfo(el, expectedType); - var type = ref.type; - var timeout = ref.timeout; - var propCount = ref.propCount; - if (!type) { return cb() } - var event = type === TRANSITION ? transitionEndEvent : animationEndEvent; - var ended = 0; - var end = function () { - el.removeEventListener(event, onEnd); - cb(); - }; - var onEnd = function (e) { - if (e.target === el) { - if (++ended >= propCount) { - end(); - } - } - }; - setTimeout(function () { - if (ended < propCount) { - end(); - } - }, timeout + 1); - el.addEventListener(event, onEnd); -} - -var transformRE = /\b(transform|all)(,|$)/; - -function getTransitionInfo (el, expectedType) { - var styles = window.getComputedStyle(el); - var transitioneDelays = styles[transitionProp + 'Delay'].split(', '); - var transitionDurations = styles[transitionProp + 'Duration'].split(', '); - var transitionTimeout = getTimeout(transitioneDelays, transitionDurations); - var animationDelays = styles[animationProp + 'Delay'].split(', '); - var animationDurations = styles[animationProp + 'Duration'].split(', '); - var animationTimeout = getTimeout(animationDelays, animationDurations); - - var type; - var timeout = 0; - var propCount = 0; - /* istanbul ignore if */ - if (expectedType === TRANSITION) { - if (transitionTimeout > 0) { - type = TRANSITION; - timeout = transitionTimeout; - propCount = transitionDurations.length; - } - } else if (expectedType === ANIMATION) { - if (animationTimeout > 0) { - type = ANIMATION; - timeout = animationTimeout; - propCount = animationDurations.length; - } - } else { - timeout = Math.max(transitionTimeout, animationTimeout); - type = timeout > 0 - ? transitionTimeout > animationTimeout - ? TRANSITION - : ANIMATION - : null; - propCount = type - ? type === TRANSITION - ? transitionDurations.length - : animationDurations.length - : 0; - } - var hasTransform = - type === TRANSITION && - transformRE.test(styles[transitionProp + 'Property']); - return { - type: type, - timeout: timeout, - propCount: propCount, - hasTransform: hasTransform - } -} - -function getTimeout (delays, durations) { - return Math.max.apply(null, durations.map(function (d, i) { - return toMs(d) + toMs(delays[i]) - })) -} - -function toMs (s) { - return Number(s.slice(0, -1)) * 1000 -} - -/* */ - -function enter (vnode) { - var el = vnode.elm; - - // call leave callback now - if (el._leaveCb) { - el._leaveCb.cancelled = true; - el._leaveCb(); - } - - var data = resolveTransition(vnode.data.transition); - if (!data) { - return - } - - /* istanbul ignore if */ - if (el._enterCb || el.nodeType !== 1) { - return - } - - var css = data.css; - var type = data.type; - var enterClass = data.enterClass; - var enterActiveClass = data.enterActiveClass; - var appearClass = data.appearClass; - var appearActiveClass = data.appearActiveClass; - var beforeEnter = data.beforeEnter; - var enter = data.enter; - var afterEnter = data.afterEnter; - var enterCancelled = data.enterCancelled; - var beforeAppear = data.beforeAppear; - var appear = data.appear; - var afterAppear = data.afterAppear; - var appearCancelled = data.appearCancelled; - - // activeInstance will always be the <transition> component managing this - // transition. One edge case to check is when the <transition> is placed - // as the root node of a child component. In that case we need to check - // <transition>'s parent for appear check. - var transitionNode = activeInstance.$vnode; - var context = transitionNode && transitionNode.parent - ? transitionNode.parent.context - : activeInstance; - - var isAppear = !context._isMounted || !vnode.isRootInsert; - - if (isAppear && !appear && appear !== '') { - return - } - - var startClass = isAppear ? appearClass : enterClass; - var activeClass = isAppear ? appearActiveClass : enterActiveClass; - var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter; - var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter; - var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter; - var enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled; - - var expectsCSS = css !== false && !isIE9; - var userWantsControl = - enterHook && - // enterHook may be a bound method which exposes - // the length of original fn as _length - (enterHook._length || enterHook.length) > 1; - - var cb = el._enterCb = once(function () { - if (expectsCSS) { - removeTransitionClass(el, activeClass); - } - if (cb.cancelled) { - if (expectsCSS) { - removeTransitionClass(el, startClass); - } - enterCancelledHook && enterCancelledHook(el); - } else { - afterEnterHook && afterEnterHook(el); - } - el._enterCb = null; - }); - - if (!vnode.data.show) { - // remove pending leave element on enter by injecting an insert hook - mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', function () { - var parent = el.parentNode; - var pendingNode = parent && parent._pending && parent._pending[vnode.key]; - if (pendingNode && pendingNode.tag === vnode.tag && pendingNode.elm._leaveCb) { - pendingNode.elm._leaveCb(); - } - enterHook && enterHook(el, cb); - }, 'transition-insert'); - } - - // start enter transition - beforeEnterHook && beforeEnterHook(el); - if (expectsCSS) { - addTransitionClass(el, startClass); - addTransitionClass(el, activeClass); - nextFrame(function () { - removeTransitionClass(el, startClass); - if (!cb.cancelled && !userWantsControl) { - whenTransitionEnds(el, type, cb); - } - }); - } - - if (vnode.data.show) { - enterHook && enterHook(el, cb); - } - - if (!expectsCSS && !userWantsControl) { - cb(); - } -} - -function leave (vnode, rm) { - var el = vnode.elm; - - // call enter callback now - if (el._enterCb) { - el._enterCb.cancelled = true; - el._enterCb(); - } - - var data = resolveTransition(vnode.data.transition); - if (!data) { - return rm() - } - - /* istanbul ignore if */ - if (el._leaveCb || el.nodeType !== 1) { - return - } - - var css = data.css; - var type = data.type; - var leaveClass = data.leaveClass; - var leaveActiveClass = data.leaveActiveClass; - var beforeLeave = data.beforeLeave; - var leave = data.leave; - var afterLeave = data.afterLeave; - var leaveCancelled = data.leaveCancelled; - var delayLeave = data.delayLeave; - - var expectsCSS = css !== false && !isIE9; - var userWantsControl = - leave && - // leave hook may be a bound method which exposes - // the length of original fn as _length - (leave._length || leave.length) > 1; - - var cb = el._leaveCb = once(function () { - if (el.parentNode && el.parentNode._pending) { - el.parentNode._pending[vnode.key] = null; - } - if (expectsCSS) { - removeTransitionClass(el, leaveActiveClass); - } - if (cb.cancelled) { - if (expectsCSS) { - removeTransitionClass(el, leaveClass); - } - leaveCancelled && leaveCancelled(el); - } else { - rm(); - afterLeave && afterLeave(el); - } - el._leaveCb = null; - }); - - if (delayLeave) { - delayLeave(performLeave); - } else { - performLeave(); - } - - function performLeave () { - // the delayed leave may have already been cancelled - if (cb.cancelled) { - return - } - // record leaving element - if (!vnode.data.show) { - (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode; - } - beforeLeave && beforeLeave(el); - if (expectsCSS) { - addTransitionClass(el, leaveClass); - addTransitionClass(el, leaveActiveClass); - nextFrame(function () { - removeTransitionClass(el, leaveClass); - if (!cb.cancelled && !userWantsControl) { - whenTransitionEnds(el, type, cb); - } - }); - } - leave && leave(el, cb); - if (!expectsCSS && !userWantsControl) { - cb(); - } - } -} - -function resolveTransition (def$$1) { - if (!def$$1) { - return - } - /* istanbul ignore else */ - if (typeof def$$1 === 'object') { - var res = {}; - if (def$$1.css !== false) { - extend(res, autoCssTransition(def$$1.name || 'v')); - } - extend(res, def$$1); - return res - } else if (typeof def$$1 === 'string') { - return autoCssTransition(def$$1) - } -} - -var autoCssTransition = cached(function (name) { - return { - enterClass: (name + "-enter"), - leaveClass: (name + "-leave"), - appearClass: (name + "-enter"), - enterActiveClass: (name + "-enter-active"), - leaveActiveClass: (name + "-leave-active"), - appearActiveClass: (name + "-enter-active") - } -}); - -function once (fn) { - var called = false; - return function () { - if (!called) { - called = true; - fn(); - } - } -} - -var transition = inBrowser ? { - create: function create (_, vnode) { - if (!vnode.data.show) { - enter(vnode); - } - }, - remove: function remove (vnode, rm) { - /* istanbul ignore else */ - if (!vnode.data.show) { - leave(vnode, rm); - } else { - rm(); - } - } -} : {}; - -var platformModules = [ - attrs, - klass, - events, - domProps, - style, - transition -]; - -/* */ - -// the directive module should be applied last, after all -// built-in modules have been applied. -var modules = platformModules.concat(baseModules); - -var patch$1 = createPatchFunction({ nodeOps: nodeOps, modules: modules }); - -/** - * Not type checking this file because flow doesn't like attaching - * properties to Elements. - */ - -var modelableTagRE = /^input|select|textarea|vue-component-[0-9]+(-[0-9a-zA-Z_\-]*)?$/; - -/* istanbul ignore if */ -if (isIE9) { - // http://www.matts411.com/post/internet-explorer-9-oninput/ - document.addEventListener('selectionchange', function () { - var el = document.activeElement; - if (el && el.vmodel) { - trigger(el, 'input'); - } - }); -} - -var model = { - inserted: function inserted (el, binding, vnode) { - if (process.env.NODE_ENV !== 'production') { - if (!modelableTagRE.test(vnode.tag)) { - warn( - "v-model is not supported on element type: <" + (vnode.tag) + ">. " + - 'If you are working with contenteditable, it\'s recommended to ' + - 'wrap a library dedicated for that purpose inside a custom component.', - vnode.context - ); - } - } - if (vnode.tag === 'select') { - var cb = function () { - setSelected(el, binding, vnode.context); - }; - cb(); - /* istanbul ignore if */ - if (isIE || isEdge) { - setTimeout(cb, 0); - } - } else if ( - (vnode.tag === 'textarea' || el.type === 'text') && - !binding.modifiers.lazy - ) { - if (!isAndroid) { - el.addEventListener('compositionstart', onCompositionStart); - el.addEventListener('compositionend', onCompositionEnd); - } - /* istanbul ignore if */ - if (isIE9) { - el.vmodel = true; - } - } - }, - componentUpdated: function componentUpdated (el, binding, vnode) { - if (vnode.tag === 'select') { - setSelected(el, binding, vnode.context); - // in case the options rendered by v-for have changed, - // it's possible that the value is out-of-sync with the rendered options. - // detect such cases and filter out values that no longer has a matchig - // option in the DOM. - var needReset = el.multiple - ? binding.value.some(function (v) { return hasNoMatchingOption(v, el.options); }) - : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, el.options); - if (needReset) { - trigger(el, 'change'); - } - } - } -}; - -function setSelected (el, binding, vm) { - var value = binding.value; - var isMultiple = el.multiple; - if (isMultiple && !Array.isArray(value)) { - process.env.NODE_ENV !== 'production' && warn( - "<select multiple v-model=\"" + (binding.expression) + "\"> " + - "expects an Array value for its binding, but got " + (Object.prototype.toString.call(value).slice(8, -1)), - vm - ); - return - } - var selected, option; - for (var i = 0, l = el.options.length; i < l; i++) { - option = el.options[i]; - if (isMultiple) { - selected = looseIndexOf(value, getValue(option)) > -1; - if (option.selected !== selected) { - option.selected = selected; - } - } else { - if (looseEqual(getValue(option), value)) { - if (el.selectedIndex !== i) { - el.selectedIndex = i; - } - return - } - } - } - if (!isMultiple) { - el.selectedIndex = -1; - } -} - -function hasNoMatchingOption (value, options) { - for (var i = 0, l = options.length; i < l; i++) { - if (looseEqual(getValue(options[i]), value)) { - return false - } - } - return true -} - -function getValue (option) { - return '_value' in option - ? option._value - : option.value -} - -function onCompositionStart (e) { - e.target.composing = true; -} - -function onCompositionEnd (e) { - e.target.composing = false; - trigger(e.target, 'input'); -} - -function trigger (el, type) { - var e = document.createEvent('HTMLEvents'); - e.initEvent(type, true, true); - el.dispatchEvent(e); -} - -/* */ - -// recursively search for possible transition defined inside the component root -function locateNode (vnode) { - return vnode.child && (!vnode.data || !vnode.data.transition) - ? locateNode(vnode.child._vnode) - : vnode -} - -var show = { - bind: function bind (el, ref, vnode) { - var value = ref.value; - - vnode = locateNode(vnode); - var transition = vnode.data && vnode.data.transition; - if (value && transition && !isIE9) { - enter(vnode); - } - var originalDisplay = el.style.display === 'none' ? '' : el.style.display; - el.style.display = value ? originalDisplay : 'none'; - el.__vOriginalDisplay = originalDisplay; - }, - update: function update (el, ref, vnode) { - var value = ref.value; - var oldValue = ref.oldValue; - - /* istanbul ignore if */ - if (value === oldValue) { return } - vnode = locateNode(vnode); - var transition = vnode.data && vnode.data.transition; - if (transition && !isIE9) { - if (value) { - enter(vnode); - el.style.display = el.__vOriginalDisplay; - } else { - leave(vnode, function () { - el.style.display = 'none'; - }); - } - } else { - el.style.display = value ? el.__vOriginalDisplay : 'none'; - } - } -}; - -var platformDirectives = { - model: model, - show: show -}; - -/* */ - -// Provides transition support for a single element/component. -// supports transition mode (out-in / in-out) - -var transitionProps = { - name: String, - appear: Boolean, - css: Boolean, - mode: String, - type: String, - enterClass: String, - leaveClass: String, - enterActiveClass: String, - leaveActiveClass: String, - appearClass: String, - appearActiveClass: String -}; - -// in case the child is also an abstract component, e.g. <keep-alive> -// we want to recrusively retrieve the real component to be rendered -function getRealChild (vnode) { - var compOptions = vnode && vnode.componentOptions; - if (compOptions && compOptions.Ctor.options.abstract) { - return getRealChild(getFirstComponentChild(compOptions.children)) - } else { - return vnode - } -} - -function extractTransitionData (comp) { - var data = {}; - var options = comp.$options; - // props - for (var key in options.propsData) { - data[key] = comp[key]; - } - // events. - // extract listeners and pass them directly to the transition methods - var listeners = options._parentListeners; - for (var key$1 in listeners) { - data[camelize(key$1)] = listeners[key$1].fn; - } - return data -} - -function placeholder (h, rawChild) { - return /\d-keep-alive$/.test(rawChild.tag) - ? h('keep-alive') - : null -} - -function hasParentTransition (vnode) { - while ((vnode = vnode.parent)) { - if (vnode.data.transition) { - return true - } - } -} - -var Transition = { - name: 'transition', - props: transitionProps, - abstract: true, - render: function render (h) { - var this$1 = this; - - var children = this.$slots.default; - if (!children) { - return - } - - // filter out text nodes (possible whitespaces) - children = children.filter(function (c) { return c.tag; }); - /* istanbul ignore if */ - if (!children.length) { - return - } - - // warn multiple elements - if (process.env.NODE_ENV !== 'production' && children.length > 1) { - warn( - '<transition> can only be used on a single element. Use ' + - '<transition-group> for lists.', - this.$parent - ); - } - - var mode = this.mode; - - // warn invalid mode - if (process.env.NODE_ENV !== 'production' && - mode && mode !== 'in-out' && mode !== 'out-in') { - warn( - 'invalid <transition> mode: ' + mode, - this.$parent - ); - } - - var rawChild = children[0]; - - // if this is a component root node and the component's - // parent container node also has transition, skip. - if (hasParentTransition(this.$vnode)) { - return rawChild - } - - // apply transition data to child - // use getRealChild() to ignore abstract components e.g. keep-alive - var child = getRealChild(rawChild); - /* istanbul ignore if */ - if (!child) { - return rawChild - } - - if (this._leaving) { - return placeholder(h, rawChild) - } - - var key = child.key = child.key == null || child.isStatic - ? ("__v" + (child.tag + this._uid) + "__") - : child.key; - var data = (child.data || (child.data = {})).transition = extractTransitionData(this); - var oldRawChild = this._vnode; - var oldChild = getRealChild(oldRawChild); - - // mark v-show - // so that the transition module can hand over the control to the directive - if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) { - child.data.show = true; - } - - if (oldChild && oldChild.data && oldChild.key !== key) { - // replace old child transition data with fresh one - // important for dynamic transitions! - var oldData = oldChild.data.transition = extend({}, data); - - // handle transition mode - if (mode === 'out-in') { - // return placeholder node and queue update when leave finishes - this._leaving = true; - mergeVNodeHook(oldData, 'afterLeave', function () { - this$1._leaving = false; - this$1.$forceUpdate(); - }, key); - return placeholder(h, rawChild) - } else if (mode === 'in-out') { - var delayedLeave; - var performLeave = function () { delayedLeave(); }; - mergeVNodeHook(data, 'afterEnter', performLeave, key); - mergeVNodeHook(data, 'enterCancelled', performLeave, key); - mergeVNodeHook(oldData, 'delayLeave', function (leave) { - delayedLeave = leave; - }, key); - } - } - - return rawChild - } -}; - -/* */ - -// Provides transition support for list items. -// supports move transitions using the FLIP technique. - -// Because the vdom's children update algorithm is "unstable" - i.e. -// it doesn't guarantee the relative positioning of removed elements, -// we force transition-group to update its children into two passes: -// in the first pass, we remove all nodes that need to be removed, -// triggering their leaving transition; in the second pass, we insert/move -// into the final disired state. This way in the second pass removed -// nodes will remain where they should be. - -var props = extend({ - tag: String, - moveClass: String -}, transitionProps); - -delete props.mode; - -var TransitionGroup = { - props: props, - - render: function render (h) { - var tag = this.tag || this.$vnode.data.tag || 'span'; - var map = Object.create(null); - var prevChildren = this.prevChildren = this.children; - var rawChildren = this.$slots.default || []; - var children = this.children = []; - var transitionData = extractTransitionData(this); - - for (var i = 0; i < rawChildren.length; i++) { - var c = rawChildren[i]; - if (c.tag) { - if (c.key != null && String(c.key).indexOf('__vlist') !== 0) { - children.push(c); - map[c.key] = c - ;(c.data || (c.data = {})).transition = transitionData; - } else if (process.env.NODE_ENV !== 'production') { - var opts = c.componentOptions; - var name = opts - ? (opts.Ctor.options.name || opts.tag) - : c.tag; - warn(("<transition-group> children must be keyed: <" + name + ">")); - } - } - } - - if (prevChildren) { - var kept = []; - var removed = []; - for (var i$1 = 0; i$1 < prevChildren.length; i$1++) { - var c$1 = prevChildren[i$1]; - c$1.data.transition = transitionData; - c$1.data.pos = c$1.elm.getBoundingClientRect(); - if (map[c$1.key]) { - kept.push(c$1); - } else { - removed.push(c$1); - } - } - this.kept = h(tag, null, kept); - this.removed = removed; - } - - return h(tag, null, children) - }, - - beforeUpdate: function beforeUpdate () { - // force removing pass - this.__patch__( - this._vnode, - this.kept, - false, // hydrating - true // removeOnly (!important, avoids unnecessary moves) - ); - this._vnode = this.kept; - }, - - updated: function updated () { - var children = this.prevChildren; - var moveClass = this.moveClass || (this.name + '-move'); - if (!children.length || !this.hasMove(children[0].elm, moveClass)) { - return - } - - // we divide the work into three loops to avoid mixing DOM reads and writes - // in each iteration - which helps prevent layout thrashing. - children.forEach(callPendingCbs); - children.forEach(recordPosition); - children.forEach(applyTranslation); - - // force reflow to put everything in position - var f = document.body.offsetHeight; // eslint-disable-line - - children.forEach(function (c) { - if (c.data.moved) { - var el = c.elm; - var s = el.style; - addTransitionClass(el, moveClass); - s.transform = s.WebkitTransform = s.transitionDuration = ''; - el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) { - if (!e || /transform$/.test(e.propertyName)) { - el.removeEventListener(transitionEndEvent, cb); - el._moveCb = null; - removeTransitionClass(el, moveClass); - } - }); - } - }); - }, - - methods: { - hasMove: function hasMove (el, moveClass) { - /* istanbul ignore if */ - if (!hasTransition) { - return false - } - if (this._hasMove != null) { - return this._hasMove - } - addTransitionClass(el, moveClass); - var info = getTransitionInfo(el); - removeTransitionClass(el, moveClass); - return (this._hasMove = info.hasTransform) - } - } -}; - -function callPendingCbs (c) { - /* istanbul ignore if */ - if (c.elm._moveCb) { - c.elm._moveCb(); - } - /* istanbul ignore if */ - if (c.elm._enterCb) { - c.elm._enterCb(); - } -} - -function recordPosition (c) { - c.data.newPos = c.elm.getBoundingClientRect(); -} - -function applyTranslation (c) { - var oldPos = c.data.pos; - var newPos = c.data.newPos; - var dx = oldPos.left - newPos.left; - var dy = oldPos.top - newPos.top; - if (dx || dy) { - c.data.moved = true; - var s = c.elm.style; - s.transform = s.WebkitTransform = "translate(" + dx + "px," + dy + "px)"; - s.transitionDuration = '0s'; - } -} - -var platformComponents = { - Transition: Transition, - TransitionGroup: TransitionGroup -}; - -/* */ - -// install platform specific utils -Vue$2.config.isUnknownElement = isUnknownElement; -Vue$2.config.isReservedTag = isReservedTag; -Vue$2.config.getTagNamespace = getTagNamespace; -Vue$2.config.mustUseProp = mustUseProp; - -// install platform runtime directives & components -extend(Vue$2.options.directives, platformDirectives); -extend(Vue$2.options.components, platformComponents); - -// install platform patch function -Vue$2.prototype.__patch__ = config._isServer ? noop : patch$1; - -// wrap mount -Vue$2.prototype.$mount = function ( - el, - hydrating -) { - el = el && !config._isServer ? query(el) : undefined; - return this._mount(el, hydrating) -}; - -// devtools global hook -/* istanbul ignore next */ -setTimeout(function () { - if (config.devtools) { - if (devtools) { - devtools.emit('init', Vue$2); - } else if ( - process.env.NODE_ENV !== 'production' && - inBrowser && /Chrome\/\d+/.test(window.navigator.userAgent) - ) { - console.log( - 'Download the Vue Devtools for a better development experience:\n' + - 'https://github.com/vuejs/vue-devtools' - ); - } - } -}, 0); - -module.exports = Vue$2; diff --git a/public/admin/static/plugin/vue/vue.min.js b/public/admin/static/plugin/vue/vue.min.js deleted file mode 100644 index f86786d..0000000 --- a/public/admin/static/plugin/vue/vue.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Vue.js v2.0.3 - * (c) 2014-2016 Evan You - * Released under the MIT License. - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Vue=t()}(this,function(){"use strict";function e(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function t(e){var t=parseFloat(e,10);return t||0===t?t:e}function n(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i<r.length;i++)n[r[i]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}function r(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}function i(e,t){return _r.call(e,t)}function a(e){return"string"==typeof e||"number"==typeof e}function o(e){var t=Object.create(null);return function(n){var r=t[n];return r||(t[n]=e(n))}}function s(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function c(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function u(e,t){for(var n in t)e[n]=t[n];return e}function l(e){return null!==e&&"object"==typeof e}function f(e){return kr.call(e)===Ar}function d(e){for(var t={},n=0;n<e.length;n++)e[n]&&u(t,e[n]);return t}function p(){}function v(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}function h(e,t){return e==t||!(!l(e)||!l(t))&&JSON.stringify(e)===JSON.stringify(t)}function m(e,t){for(var n=0;n<e.length;n++)if(h(e[n],t))return n;return-1}function g(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function y(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function _(e){if(!Sr.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}function b(e){return/native code/.test(e.toString())}function $(e){Hr.target&&Ur.push(Hr.target),Hr.target=e}function w(){Hr.target=Ur.pop()}function C(){zr.length=0,Vr={},Jr=qr=!1}function x(){for(qr=!0,zr.sort(function(e,t){return e.id-t.id}),Kr=0;Kr<zr.length;Kr++){var e=zr[Kr],t=e.id;Vr[t]=null,e.run()}Ir&&Tr.devtools&&Ir.emit("flush"),C()}function k(e){var t=e.id;if(null==Vr[t]){if(Vr[t]=!0,qr){for(var n=zr.length-1;n>=0&&zr[n].id>e.id;)n--;zr.splice(Math.max(n,Kr)+1,0,e)}else zr.push(e);Jr||(Jr=!0,Br(x))}}function A(e,t){var n,r;t||(t=Gr,t.clear());var i=Array.isArray(e),a=l(e);if((i||a)&&Object.isExtensible(e)){if(e.__ob__){var o=e.__ob__.dep.id;if(t.has(o))return;t.add(o)}if(i)for(n=e.length;n--;)A(e[n],t);else if(a)for(r=Object.keys(e),n=r.length;n--;)A(e[r[n]],t)}}function O(e,t){e.__proto__=t}function T(e,t,n){for(var r=0,i=n.length;r<i;r++){var a=n[r];y(e,a,t[a])}}function S(e){if(l(e)){var t;return i(e,"__ob__")&&e.__ob__ instanceof ti?t=e.__ob__:ei.shouldConvert&&!Tr._isServer&&(Array.isArray(e)||f(e))&&Object.isExtensible(e)&&!e._isVue&&(t=new ti(e)),t}}function E(e,t,n,r){var i=new Hr,a=Object.getOwnPropertyDescriptor(e,t);if(!a||a.configurable!==!1){var o=a&&a.get,s=a&&a.set,c=S(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=o?o.call(e):n;return Hr.target&&(i.depend(),c&&c.dep.depend(),Array.isArray(t)&&N(t)),t},set:function(t){var r=o?o.call(e):n;t!==r&&(s?s.call(e,t):n=t,c=S(t),i.notify())}})}}function j(e,t,n){if(Array.isArray(e))return e.splice(t,1,n),n;if(i(e,t))return void(e[t]=n);var r=e.__ob__;if(!(e._isVue||r&&r.vmCount))return r?(E(r.value,t,n),r.dep.notify(),n):void(e[t]=n)}function L(e,t){var n=e.__ob__;e._isVue||n&&n.vmCount||i(e,t)&&(delete e[t],n&&n.dep.notify())}function N(e){for(var t=void 0,n=0,r=e.length;n<r;n++)t=e[n],t&&t.__ob__&&t.__ob__.dep.depend(),Array.isArray(t)&&N(t)}function D(e){e._watchers=[],M(e),P(e),R(e),B(e),F(e)}function M(e){var t=e.$options.props;if(t){var n=e.$options.propsData||{},r=e.$options._propKeys=Object.keys(t),i=!e.$parent;ei.shouldConvert=i;for(var a=function(i){var a=r[i];E(e,a,Le(a,t,n,e))},o=0;o<r.length;o++)a(o);ei.shouldConvert=!0}}function P(e){var t=e.$options.data;t=e._data="function"==typeof t?t.call(e):t||{},f(t)||(t={});for(var n=Object.keys(t),r=e.$options.props,a=n.length;a--;)r&&i(r,n[a])||z(e,n[a]);S(t),t.__ob__&&t.__ob__.vmCount++}function R(e){var t=e.$options.computed;if(t)for(var n in t){var r=t[n];"function"==typeof r?(ni.get=I(r,e),ni.set=p):(ni.get=r.get?r.cache!==!1?I(r.get,e):s(r.get,e):p,ni.set=r.set?s(r.set,e):p),Object.defineProperty(e,n,ni)}}function I(e,t){var n=new Zr(t,e,p,{lazy:!0});return function(){return n.dirty&&n.evaluate(),Hr.target&&n.depend(),n.value}}function B(e){var t=e.$options.methods;if(t)for(var n in t)e[n]=null==t[n]?p:s(t[n],e)}function F(e){var t=e.$options.watch;if(t)for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i<r.length;i++)H(e,n,r[i]);else H(e,n,r)}}function H(e,t,n){var r;f(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function U(e){var t={};t.get=function(){return this._data},Object.defineProperty(e.prototype,"$data",t),e.prototype.$set=j,e.prototype.$delete=L,e.prototype.$watch=function(e,t,n){var r=this;n=n||{},n.user=!0;var i=new Zr(r,e,t,n);return n.immediate&&t.call(r,i.value),function(){i.teardown()}}}function z(e,t){g(t)||Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return e._data[t]},set:function(n){e._data[t]=n}})}function V(e){var t=new ri(e.tag,e.data,e.children,e.text,e.elm,e.ns,e.context,e.componentOptions);return t.isStatic=e.isStatic,t.key=e.key,t.isCloned=!0,t}function J(e){for(var t=new Array(e.length),n=0;n<e.length;n++)t[n]=V(e[n]);return t}function q(e,t,n,r){r+=t;var i=e.__injected||(e.__injected={});if(!i[r]){i[r]=!0;var a=e[t];a?e[t]=function(){a.apply(this,arguments),n.apply(this,arguments)}:e[t]=n}}function K(e,t,n,r,i){var a,o,s,c,u,l;for(a in e)if(o=e[a],s=t[a],o)if(s){if(o!==s)if(Array.isArray(s)){s.length=o.length;for(var f=0;f<s.length;f++)s[f]=o[f];e[a]=s}else s.fn=o,e[a]=s}else l="!"===a.charAt(0),u=l?a.slice(1):a,Array.isArray(o)?n(u,o.invoker=W(o),l):(o.invoker||(c=o,o=e[a]={},o.fn=c,o.invoker=Z(o)),n(u,o.invoker,l));else;for(a in t)e[a]||(u="!"===a.charAt(0)?a.slice(1):a,r(u,t[a].invoker))}function W(e){return function(t){for(var n=arguments,r=1===arguments.length,i=0;i<e.length;i++)r?e[i](t):e[i].apply(null,n)}}function Z(e){return function(t){var n=1===arguments.length;n?e.fn(t):e.fn.apply(null,arguments)}}function G(e,t,n){if(a(e))return[Y(e)];if(Array.isArray(e)){for(var r=[],i=0,o=e.length;i<o;i++){var s=e[i],c=r[r.length-1];Array.isArray(s)?r.push.apply(r,G(s,t,(n||"")+"_"+i)):a(s)?c&&c.text?c.text+=String(s):""!==s&&r.push(Y(s)):s instanceof ri&&(s.text&&c&&c.text?c.text+=s.text:(t&&Q(s,t),s.tag&&null==s.key&&null!=n&&(s.key="__vlist"+n+"_"+i+"__"),r.push(s)))}return r}}function Y(e){return new ri(void 0,void 0,void 0,String(e))}function Q(e,t){if(e.tag&&!e.ns&&(e.ns=t,e.children))for(var n=0,r=e.children.length;n<r;n++)Q(e.children[n],t)}function X(e){return e&&e.filter(function(e){return e&&e.componentOptions})[0]}function ee(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}function te(e){e.prototype._mount=function(e,t){var n=this;return n.$el=e,n.$options.render||(n.$options.render=ii),ne(n,"beforeMount"),n._watcher=new Zr(n,function(){n._update(n._render(),t)},p),t=!1,null==n.$vnode&&(n._isMounted=!0,ne(n,"mounted")),n},e.prototype._update=function(e,t){var n=this;n._isMounted&&ne(n,"beforeUpdate");var r=n.$el,i=ai;ai=n;var a=n._vnode;n._vnode=e,a?n.$el=n.__patch__(a,e):n.$el=n.__patch__(n.$el,e,t),ai=i,r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el),n._isMounted&&ne(n,"updated")},e.prototype._updateFromParent=function(e,t,n,r){var i=this,a=!(!i.$options._renderChildren&&!r);if(i.$options._parentVnode=n,i.$options._renderChildren=r,e&&i.$options.props){ei.shouldConvert=!1;for(var o=i.$options._propKeys||[],s=0;s<o.length;s++){var c=o[s];i[c]=Le(c,i.$options.props,e,i)}ei.shouldConvert=!0}if(t){var u=i.$options._parentListeners;i.$options._parentListeners=t,i._updateListeners(t,u)}a&&(i.$slots=_e(r,i._renderContext),i.$forceUpdate())},e.prototype.$forceUpdate=function(){var e=this;e._watcher&&e._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){ne(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||r(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,ne(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.__patch__(e._vnode,null)}}}function ne(e,t){var n=e.$options[t];if(n)for(var r=0,i=n.length;r<i;r++)n[r].call(e);e.$emit("hook:"+t)}function re(e,t,n,r,i){if(e&&(l(e)&&(e=Ce.extend(e)),"function"==typeof e)){if(!e.cid)if(e.resolved)e=e.resolved;else if(e=le(e,function(){n.$forceUpdate()}),!e)return;t=t||{};var a=fe(t,e);if(e.options.functional)return ie(e,a,t,n,r);var o=t.on;t.on=t.nativeOn,e.options.abstract&&(t={}),pe(t);var s=e.options.name||i,c=new ri("vue-component-"+e.cid+(s?"-"+s:""),t,void 0,void 0,void 0,void 0,n,{Ctor:e,propsData:a,listeners:o,tag:i,children:r});return c}}function ie(e,t,n,r,i){var a={},o=e.options.props;if(o)for(var c in o)a[c]=Le(c,o,t);var u=e.options.render.call(null,s(he,{_self:Object.create(r)}),{props:a,data:n,parent:r,children:G(i),slots:function(){return _e(i,r)}});return u instanceof ri&&(u.functionalContext=r,n.slot&&((u.data||(u.data={})).slot=n.slot)),u}function ae(e,t){var n=e.componentOptions,r={_isComponent:!0,parent:t,propsData:n.propsData,_componentTag:n.tag,_parentVnode:e,_parentListeners:n.listeners,_renderChildren:n.children},i=e.data.inlineTemplate;return i&&(r.render=i.render,r.staticRenderFns=i.staticRenderFns),new n.Ctor(r)}function oe(e,t){if(!e.child||e.child._isDestroyed){var n=e.child=ae(e,ai);n.$mount(t?e.elm:void 0,t)}}function se(e,t){var n=t.componentOptions,r=t.child=e.child;r._updateFromParent(n.propsData,n.listeners,t,n.children)}function ce(e){e.child._isMounted||(e.child._isMounted=!0,ne(e.child,"mounted")),e.data.keepAlive&&(e.child._inactive=!1,ne(e.child,"activated"))}function ue(e){e.child._isDestroyed||(e.data.keepAlive?(e.child._inactive=!0,ne(e.child,"deactivated")):e.child.$destroy())}function le(e,t){if(!e.requested){e.requested=!0;var n=e.pendingCallbacks=[t],r=!0,i=function(t){if(l(t)&&(t=Ce.extend(t)),e.resolved=t,!r)for(var i=0,a=n.length;i<a;i++)n[i](t)},a=function(e){},o=e(i,a);return o&&"function"==typeof o.then&&!e.resolved&&o.then(i,a),r=!1,e.resolved}e.pendingCallbacks.push(t)}function fe(e,t){var n=t.options.props;if(n){var r={},i=e.attrs,a=e.props,o=e.domProps;if(i||a||o)for(var s in n){var c=xr(s);de(r,a,s,c,!0)||de(r,i,s,c)||de(r,o,s,c)}return r}}function de(e,t,n,r,a){if(t){if(i(t,n))return e[n]=t[n],a||delete t[n],!0;if(i(t,r))return e[n]=t[r],a||delete t[r],!0}return!1}function pe(e){e.hook||(e.hook={});for(var t=0;t<si.length;t++){var n=si[t],r=e.hook[n],i=oi[n];e.hook[n]=r?ve(i,r):i}}function ve(e,t){return function(n,r){e(n,r),t(n,r)}}function he(e,t,n){return t&&(Array.isArray(t)||"object"!=typeof t)&&(n=t,t=void 0),me(this._self,e,t,n)}function me(e,t,n,r){if(!n||!n.__ob__){if(!t)return ii();if("string"==typeof t){var i,a=Tr.getTagNamespace(t);return Tr.isReservedTag(t)?new ri(t,n,G(r,a),void 0,void 0,a,e):(i=je(e.$options,"components",t))?re(i,n,e,r,t):new ri(t,n,G(r,a),void 0,void 0,a,e)}return re(t,n,e,r)}}function ge(e){e.$vnode=null,e._vnode=null,e._staticTrees=null,e._renderContext=e.$options._parentVnode&&e.$options._parentVnode.context,e.$slots=_e(e.$options._renderChildren,e._renderContext),e.$createElement=s(he,e),e.$options.el&&e.$mount(e.$options.el)}function ye(n){n.prototype.$nextTick=function(e){Br(e,this)},n.prototype._render=function(){var e=this,t=e.$options,n=t.render,r=t.staticRenderFns,i=t._parentVnode;if(e._isMounted)for(var a in e.$slots)e.$slots[a]=J(e.$slots[a]);r&&!e._staticTrees&&(e._staticTrees=[]),e.$vnode=i;var o;try{o=n.call(e._renderProxy,e.$createElement)}catch(t){if(Tr.errorHandler)Tr.errorHandler.call(null,t,e);else{if(Tr._isServer)throw t;setTimeout(function(){throw t},0)}o=e._vnode}return o instanceof ri||(o=ii()),o.parent=i,o},n.prototype._h=he,n.prototype._s=e,n.prototype._n=t,n.prototype._e=ii,n.prototype._q=h,n.prototype._i=m,n.prototype._m=function(e,t){var n=this._staticTrees[e];if(n&&!t)return Array.isArray(n)?J(n):V(n);if(n=this._staticTrees[e]=this.$options.staticRenderFns[e].call(this._renderProxy),Array.isArray(n))for(var r=0;r<n.length;r++)"string"!=typeof n[r]&&(n[r].isStatic=!0,n[r].key="__static__"+e+"_"+r);else n.isStatic=!0,n.key="__static__"+e;return n};var r=function(e){return e};n.prototype._f=function(e){return je(this.$options,"filters",e,!0)||r},n.prototype._l=function(e,t){var n,r,i,a,o;if(Array.isArray(e))for(n=new Array(e.length),r=0,i=e.length;r<i;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(l(e))for(a=Object.keys(e),n=new Array(a.length),r=0,i=a.length;r<i;r++)o=a[r],n[r]=t(e[o],o,r);return n},n.prototype._t=function(e,t){var n=this.$slots[e];return n||t},n.prototype._b=function(e,t,n){if(t)if(l(t)){Array.isArray(t)&&(t=d(t));for(var r in t)if("class"===r||"style"===r)e[r]=t[r];else{var i=n||Tr.mustUseProp(r)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={});i[r]=t[r]}}else;return e},n.prototype._k=function(e){return Tr.keyCodes[e]}}function _e(e,t){var n={};if(!e)return n;for(var r,i,a=G(e)||[],o=[],s=0,c=a.length;s<c;s++)if(i=a[s],(i.context===t||i.functionalContext===t)&&i.data&&(r=i.data.slot)){var u=n[r]||(n[r]=[]);"template"===i.tag?u.push.apply(u,i.children):u.push(i)}else o.push(i);return o.length&&(1!==o.length||" "!==o[0].text&&!o[0].isComment)&&(n.default=o),n}function be(e){e._events=Object.create(null);var t=e.$options._parentListeners,n=s(e.$on,e),r=s(e.$off,e);e._updateListeners=function(t,i){K(t,i||{},n,r,e)},t&&e._updateListeners(t)}function $e(e){e.prototype.$on=function(e,t){var n=this;return(n._events[e]||(n._events[e]=[])).push(t),n},e.prototype.$once=function(e,t){function n(){r.$off(e,n),t.apply(r,arguments)}var r=this;return n.fn=t,r.$on(e,n),r},e.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;var r=n._events[e];if(!r)return n;if(1===arguments.length)return n._events[e]=null,n;for(var i,a=r.length;a--;)if(i=r[a],i===t||i.fn===t){r.splice(a,1);break}return n},e.prototype.$emit=function(e){var t=this,n=t._events[e];if(n){n=n.length>1?c(n):n;for(var r=c(arguments,1),i=0,a=n.length;i<a;i++)n[i].apply(t,r)}return t}}function we(e){function t(e,t){var r=e.$options=Object.create(n(e));r.parent=t.parent,r.propsData=t.propsData,r._parentVnode=t._parentVnode,r._parentListeners=t._parentListeners,r._renderChildren=t._renderChildren,r._componentTag=t._componentTag,t.render&&(r.render=t.render,r.staticRenderFns=t.staticRenderFns)}function n(e){var t=e.constructor,n=t.options;if(t.super){var r=t.super.options,i=t.superOptions;r!==i&&(t.superOptions=r,n=t.options=Ee(r,t.extendOptions),n.name&&(n.components[n.name]=t))}return n}e.prototype._init=function(e){var r=this;r._uid=ci++,r._isVue=!0,e&&e._isComponent?t(r,e):r.$options=Ee(n(r),e||{},r),r._renderProxy=r,r._self=r,ee(r),be(r),ne(r,"beforeCreate"),D(r),ne(r,"created"),ge(r)}}function Ce(e){this._init(e)}function xe(e,t){var n,r,a;for(n in t)r=e[n],a=t[n],i(e,n)?l(r)&&l(a)&&xe(r,a):j(e,n,a);return e}function ke(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function Ae(e,t){var n=Object.create(e||null);return t?u(n,t):n}function Oe(e){if(e.components){var t,n=e.components;for(var r in n){var i=r.toLowerCase();yr(i)||Tr.isReservedTag(i)||(t=n[r],f(t)&&(n[r]=Ce.extend(t)))}}}function Te(e){var t=e.props;if(t){var n,r,i,a={};if(Array.isArray(t))for(n=t.length;n--;)r=t[n],"string"==typeof r&&(i=$r(r),a[i]={type:null});else if(f(t))for(var o in t)r=t[o],i=$r(o),a[i]=f(r)?r:{type:r};e.props=a}}function Se(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}function Ee(e,t,n){function r(r){var i=fi[r]||di;l[r]=i(e[r],t[r],n,r)}Oe(t),Te(t),Se(t);var a=t.extends;if(a&&(e="function"==typeof a?Ee(e,a.options,n):Ee(e,a,n)),t.mixins)for(var o=0,s=t.mixins.length;o<s;o++){var c=t.mixins[o];c.prototype instanceof Ce&&(c=c.options),e=Ee(e,c,n)}var u,l={};for(u in e)r(u);for(u in t)i(e,u)||r(u);return l}function je(e,t,n,r){if("string"==typeof n){var i=e[t],a=i[n]||i[$r(n)]||i[wr($r(n))];return a}}function Le(e,t,n,r){var a=t[e],o=!i(n,e),s=n[e];if(Me(a.type)&&(o&&!i(a,"default")?s=!1:""!==s&&s!==xr(e)||(s=!0)),void 0===s){s=Ne(r,a,e);var c=ei.shouldConvert;ei.shouldConvert=!0,S(s),ei.shouldConvert=c}return s}function Ne(e,t,n){if(i(t,"default")){var r=t.default;return l(r),"function"==typeof r&&t.type!==Function?r.call(e):r}}function De(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t&&t[1]}function Me(e){if(!Array.isArray(e))return"Boolean"===De(e);for(var t=0,n=e.length;t<n;t++)if("Boolean"===De(e[t]))return!0;return!1}function Pe(e){e.use=function(e){if(!e.installed){var t=c(arguments,1);return t.unshift(this),"function"==typeof e.install?e.install.apply(e,t):e.apply(null,t),e.installed=!0,this}}}function Re(e){e.mixin=function(t){e.options=Ee(e.options,t)}}function Ie(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=0===n.cid;if(r&&e._Ctor)return e._Ctor;var i=e.name||n.options.name,a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=Ee(n.options,e),a.super=n,a.extend=n.extend,Tr._assetTypes.forEach(function(e){a[e]=n[e]}),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,r&&(e._Ctor=a),a}}function Be(e){Tr._assetTypes.forEach(function(t){e[t]=function(n,r){return r?("component"===t&&f(r)&&(r.name=r.name||n,r=e.extend(r)),"directive"===t&&"function"==typeof r&&(r={bind:r,update:r}),this.options[t+"s"][n]=r,r):this.options[t+"s"][n]}})}function Fe(e){var t={};t.get=function(){return Tr},Object.defineProperty(e,"config",t),e.util=pi,e.set=j,e.delete=L,e.nextTick=Br,e.options=Object.create(null),Tr._assetTypes.forEach(function(t){e.options[t+"s"]=Object.create(null)}),u(e.options.components,hi),Pe(e),Re(e),Ie(e),Be(e)}function He(e){for(var t=e.data,n=e,r=e;r.child;)r=r.child._vnode,r.data&&(t=Ue(r.data,t));for(;n=n.parent;)n.data&&(t=Ue(t,n.data));return ze(t)}function Ue(e,t){return{staticClass:Ve(e.staticClass,t.staticClass),class:e.class?[e.class,t.class]:t.class}}function ze(e){var t=e.class,n=e.staticClass;return n||t?Ve(n,Je(t)):""}function Ve(e,t){return e?t?e+" "+t:e:t||""}function Je(e){var t="";if(!e)return t;if("string"==typeof e)return e;if(Array.isArray(e)){for(var n,r=0,i=e.length;r<i;r++)e[r]&&(n=Je(e[r]))&&(t+=n+" ");return t.slice(0,-1)}if(l(e)){for(var a in e)e[a]&&(t+=a+" ");return t.slice(0,-1)}return t}function qe(e){return Si(e)?"svg":"math"===e?"math":void 0}function Ke(e){if(!jr)return!0;if(ji(e))return!1;if(e=e.toLowerCase(),null!=Li[e])return Li[e];var t=document.createElement(e);return e.indexOf("-")>-1?Li[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Li[e]=/HTMLUnknownElement/.test(t.toString())}function We(e){if("string"==typeof e){if(e=document.querySelector(e),!e)return document.createElement("div")}return e}function Ze(e,t){var n=document.createElement(e);return"select"!==e?n:(t.data&&t.data.attrs&&"multiple"in t.data.attrs&&n.setAttribute("multiple","multiple"),n)}function Ge(e,t){return document.createElementNS(xi[e],t)}function Ye(e){return document.createTextNode(e)}function Qe(e){return document.createComment(e)}function Xe(e,t,n){e.insertBefore(t,n)}function et(e,t){e.removeChild(t)}function tt(e,t){e.appendChild(t)}function nt(e){return e.parentNode}function rt(e){return e.nextSibling}function it(e){return e.tagName}function at(e,t){e.textContent=t}function ot(e){return e.childNodes}function st(e,t,n){e.setAttribute(t,n)}function ct(e,t){var n=e.data.ref;if(n){var i=e.context,a=e.child||e.elm,o=i.$refs;t?Array.isArray(o[n])?r(o[n],a):o[n]===a&&(o[n]=void 0):e.data.refInFor?Array.isArray(o[n])?o[n].push(a):o[n]=[a]:o[n]=a}}function ut(e){return null==e}function lt(e){return null!=e}function ft(e,t){return e.key===t.key&&e.tag===t.tag&&e.isComment===t.isComment&&!e.data==!t.data}function dt(e,t,n){var r,i,a={};for(r=t;r<=n;++r)i=e[r].key,lt(i)&&(a[i]=r);return a}function pt(e){function t(e){return new ri(C.tagName(e).toLowerCase(),{},[],void 0,e)}function n(e,t){function n(){0===--n.listeners&&r(e)}return n.listeners=t,n}function r(e){var t=C.parentNode(e);C.removeChild(t,e)}function i(e,t,n){var r,i=e.data;if(e.isRootInsert=!n,lt(i)&&(lt(r=i.hook)&<(r=r.init)&&r(e),lt(r=e.child)))return u(e,t),e.elm;var a=e.children,s=e.tag;return lt(s)?(e.elm=e.ns?C.createElementNS(e.ns,s):C.createElement(s,e),l(e),o(e,a,t),lt(i)&&c(e,t)):e.isComment?e.elm=C.createComment(e.text):e.elm=C.createTextNode(e.text),e.elm}function o(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)C.appendChild(e.elm,i(t[r],n,!0));else a(e.text)&&C.appendChild(e.elm,C.createTextNode(e.text))}function s(e){for(;e.child;)e=e.child._vnode;return lt(e.tag)}function c(e,t){for(var n=0;n<$.create.length;++n)$.create[n](Mi,e);_=e.data.hook,lt(_)&&(_.create&&_.create(Mi,e),_.insert&&t.push(e))}function u(e,t){e.data.pendingInsert&&t.push.apply(t,e.data.pendingInsert),e.elm=e.child.$el,s(e)?(c(e,t),l(e)):(ct(e),t.push(e))}function l(e){var t;lt(t=e.context)&<(t=t.$options._scopeId)&&C.setAttribute(e.elm,t,""),lt(t=ai)&&t!==e.context&<(t=t.$options._scopeId)&&C.setAttribute(e.elm,t,"")}function f(e,t,n,r,a,o){for(;r<=a;++r)C.insertBefore(e,i(n[r],o),t)}function d(e){var t,n,r=e.data;if(lt(r))for(lt(t=r.hook)&<(t=t.destroy)&&t(e),t=0;t<$.destroy.length;++t)$.destroy[t](e);if(lt(t=e.children))for(n=0;n<e.children.length;++n)d(e.children[n])}function p(e,t,n,r){for(;n<=r;++n){var i=t[n];lt(i)&&(lt(i.tag)?(v(i),d(i)):C.removeChild(e,i.elm))}}function v(e,t){if(t||lt(e.data)){var i=$.remove.length+1;for(t?t.listeners+=i:t=n(e.elm,i),lt(_=e.child)&<(_=_._vnode)&<(_.data)&&v(_,t),_=0;_<$.remove.length;++_)$.remove[_](e,t);lt(_=e.data.hook)&<(_=_.remove)?_(e,t):t()}else r(e.elm)}function h(e,t,n,r,a){for(var o,s,c,u,l=0,d=0,v=t.length-1,h=t[0],g=t[v],y=n.length-1,_=n[0],b=n[y],$=!a;l<=v&&d<=y;)ut(h)?h=t[++l]:ut(g)?g=t[--v]:ft(h,_)?(m(h,_,r),h=t[++l],_=n[++d]):ft(g,b)?(m(g,b,r),g=t[--v],b=n[--y]):ft(h,b)?(m(h,b,r),$&&C.insertBefore(e,h.elm,C.nextSibling(g.elm)),h=t[++l],b=n[--y]):ft(g,_)?(m(g,_,r),$&&C.insertBefore(e,g.elm,h.elm),g=t[--v],_=n[++d]):(ut(o)&&(o=dt(t,l,v)),s=lt(_.key)?o[_.key]:null,ut(s)?(C.insertBefore(e,i(_,r),h.elm),_=n[++d]):(c=t[s],c.tag!==_.tag?(C.insertBefore(e,i(_,r),h.elm),_=n[++d]):(m(c,_,r),t[s]=void 0,$&&C.insertBefore(e,_.elm,h.elm),_=n[++d])));l>v?(u=ut(n[y+1])?null:n[y+1].elm,f(e,u,n,d,y,r)):d>y&&p(e,t,l,v)}function m(e,t,n,r){if(e!==t){if(t.isStatic&&e.isStatic&&t.key===e.key&&t.isCloned)return void(t.elm=e.elm);var i,a=t.data,o=lt(a);o&<(i=a.hook)&<(i=i.prepatch)&&i(e,t);var c=t.elm=e.elm,u=e.children,l=t.children;if(o&&s(t)){for(i=0;i<$.update.length;++i)$.update[i](e,t);lt(i=a.hook)&<(i=i.update)&&i(e,t)}ut(t.text)?lt(u)&<(l)?u!==l&&h(c,u,l,n,r):lt(l)?(lt(e.text)&&C.setTextContent(c,""),f(c,null,l,0,l.length-1,n)):lt(u)?p(c,u,0,u.length-1):lt(e.text)&&C.setTextContent(c,""):e.text!==t.text&&C.setTextContent(c,t.text),o&<(i=a.hook)&<(i=i.postpatch)&&i(e,t)}}function g(e,t,n){if(n&&e.parent)e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}function y(e,t,n){t.elm=e;var r=t.tag,i=t.data,a=t.children;if(lt(i)&&(lt(_=i.hook)&<(_=_.init)&&_(t,!0),lt(_=t.child)))return u(t,n),!0;if(lt(r)){if(lt(a)){var s=C.childNodes(e);if(s.length){var l=!0;if(s.length!==a.length)l=!1;else for(var f=0;f<a.length;f++)if(!y(s[f],a[f],n)){l=!1;break}if(!l)return!1}else o(t,a,n)}lt(i)&&c(t,n)}return!0}var _,b,$={},w=e.modules,C=e.nodeOps;for(_=0;_<Pi.length;++_)for($[Pi[_]]=[],b=0;b<w.length;++b)void 0!==w[b][Pi[_]]&&$[Pi[_]].push(w[b][Pi[_]]);return function(e,n,r,a){if(!n)return void(e&&d(e));var o,c,u=!1,l=[];if(e){var f=lt(e.nodeType);if(!f&&ft(e,n))m(e,n,l,a);else{if(f){if(1===e.nodeType&&e.hasAttribute("server-rendered")&&(e.removeAttribute("server-rendered"),r=!0),r&&y(e,n,l))return g(n,l,!0),e;e=t(e)}if(o=e.elm,c=C.parentNode(o),i(n,l),n.parent&&(n.parent.elm=n.elm,s(n)))for(var v=0;v<$.create.length;++v)$.create[v](Mi,n.parent);null!==c?(C.insertBefore(c,n.elm,C.nextSibling(o)),p(c,[e],0,0)):lt(e.tag)&&d(e)}}else u=!0,i(n,l);return g(n,l,u),n.elm}}function vt(e,t){if(e.data.directives||t.data.directives){var n,r,i,a=e===Mi,o=ht(e.data.directives,e.context),s=ht(t.data.directives,t.context),c=[],u=[];for(n in s)r=o[n],i=s[n],r?(i.oldValue=r.value,gt(i,"update",t,e),i.def&&i.def.componentUpdated&&u.push(i)):(gt(i,"bind",t,e),i.def&&i.def.inserted&&c.push(i));if(c.length){var l=function(){c.forEach(function(n){gt(n,"inserted",t,e)})};a?q(t.data.hook||(t.data.hook={}),"insert",l,"dir-insert"):l()}if(u.length&&q(t.data.hook||(t.data.hook={}),"postpatch",function(){u.forEach(function(n){gt(n,"componentUpdated",t,e)})},"dir-postpatch"),!a)for(n in o)s[n]||gt(o[n],"unbind",e)}}function ht(e,t){var n=Object.create(null);if(!e)return n;var r,i;for(r=0;r<e.length;r++)i=e[r],i.modifiers||(i.modifiers=Ii),n[mt(i)]=i,i.def=je(t.$options,"directives",i.name,!0);return n}function mt(e){return e.rawName||e.name+"."+Object.keys(e.modifiers||{}).join(".")}function gt(e,t,n,r){var i=e.def&&e.def[t];i&&i(n.elm,e,n,r)}function yt(e,t){if(e.data.attrs||t.data.attrs){var n,r,i,a=t.elm,o=e.data.attrs||{},s=t.data.attrs||{};s.__ob__&&(s=t.data.attrs=u({},s));for(n in s)r=s[n],i=o[n],i!==r&&_t(a,n,r);for(n in o)null==s[n]&&($i(n)?a.removeAttributeNS(bi,wi(n)):yi(n)||a.removeAttribute(n))}}function _t(e,t,n){_i(t)?Ci(n)?e.removeAttribute(t):e.setAttribute(t,t):yi(t)?e.setAttribute(t,Ci(n)||"false"===n?"false":"true"):$i(t)?Ci(n)?e.removeAttributeNS(bi,wi(t)):e.setAttributeNS(bi,t,n):Ci(n)?e.removeAttribute(t):e.setAttribute(t,n)}function bt(e,t){var n=t.elm,r=t.data,i=e.data;if(r.staticClass||r.class||i&&(i.staticClass||i.class)){var a=He(t),o=n._transitionClasses;o&&(a=Ve(a,Je(o))),a!==n._prevClass&&(n.setAttribute("class",a),n._prevClass=a)}}function $t(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{},i=t.elm._v_add||(t.elm._v_add=function(e,n,r){t.elm.addEventListener(e,n,r)}),a=t.elm._v_remove||(t.elm._v_remove=function(e,n){t.elm.removeEventListener(e,n)});K(n,r,i,a,t.context)}}function wt(e,t){if(e.data.domProps||t.data.domProps){var n,r,i=t.elm,a=e.data.domProps||{},o=t.data.domProps||{};o.__ob__&&(o=t.data.domProps=u({},o));for(n in a)null==o[n]&&(i[n]=void 0);for(n in o)if("textContent"!==n&&"innerHTML"!==n||!t.children||(t.children.length=0),r=o[n],"value"===n){i._value=r;var s=null==r?"":String(r);i.value===s||i.composing||(i.value=s)}else i[n]=r}}function Ct(e,t){if(e.data&&e.data.style||t.data.style){var n,r,i=t.elm,a=e.data.style||{},o=t.data.style||{};if("string"==typeof o)return void(i.style.cssText=o);var s=o.__ob__;Array.isArray(o)&&(o=t.data.style=d(o)),s&&(o=t.data.style=u({},o));for(r in a)null==o[r]&&(i.style[Ji(r)]="");for(r in o)n=o[r],n!==a[r]&&(i.style[Ji(r)]=null==n?"":n)}}function xt(e,t){if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+e.getAttribute("class")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function kt(e,t){if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t);else{for(var n=" "+e.getAttribute("class")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");e.setAttribute("class",n.trim())}}function At(e){ea(function(){ea(e)})}function Ot(e,t){(e._transitionClasses||(e._transitionClasses=[])).push(t),xt(e,t)}function Tt(e,t){e._transitionClasses&&r(e._transitionClasses,t),kt(e,t)}function St(e,t,n){var r=Et(e,t),i=r.type,a=r.timeout,o=r.propCount;if(!i)return n();var s=i===Wi?Yi:Xi,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=o&&u()};setTimeout(function(){c<o&&u()},a+1),e.addEventListener(s,l)}function Et(e,t){var n,r=window.getComputedStyle(e),i=r[Gi+"Delay"].split(", "),a=r[Gi+"Duration"].split(", "),o=jt(i,a),s=r[Qi+"Delay"].split(", "),c=r[Qi+"Duration"].split(", "),u=jt(s,c),l=0,f=0;t===Wi?o>0&&(n=Wi,l=o,f=a.length):t===Zi?u>0&&(n=Zi,l=u,f=c.length):(l=Math.max(o,u),n=l>0?o>u?Wi:Zi:null,f=n?n===Wi?a.length:c.length:0);var d=n===Wi&&ta.test(r[Gi+"Property"]);return{type:n,timeout:l,propCount:f,hasTransform:d}}function jt(e,t){return Math.max.apply(null,t.map(function(t,n){return Lt(t)+Lt(e[n])}))}function Lt(e){return 1e3*Number(e.slice(0,-1))}function Nt(e){var t=e.elm;t._leaveCb&&(t._leaveCb.cancelled=!0,t._leaveCb());var n=Mt(e.data.transition);if(n&&!t._enterCb&&1===t.nodeType){var r=n.css,i=n.type,a=n.enterClass,o=n.enterActiveClass,s=n.appearClass,c=n.appearActiveClass,u=n.beforeEnter,l=n.enter,f=n.afterEnter,d=n.enterCancelled,p=n.beforeAppear,v=n.appear,h=n.afterAppear,m=n.appearCancelled,g=ai.$vnode,y=g&&g.parent?g.parent.context:ai,_=!y._isMounted||!e.isRootInsert;if(!_||v||""===v){var b=_?s:a,$=_?c:o,w=_?p||u:u,C=_&&"function"==typeof v?v:l,x=_?h||f:f,k=_?m||d:d,A=r!==!1&&!Dr,O=C&&(C._length||C.length)>1,T=t._enterCb=Pt(function(){A&&Tt(t,$),T.cancelled?(A&&Tt(t,b),k&&k(t)):x&&x(t),t._enterCb=null});e.data.show||q(e.data.hook||(e.data.hook={}),"insert",function(){var n=t.parentNode,r=n&&n._pending&&n._pending[e.key];r&&r.tag===e.tag&&r.elm._leaveCb&&r.elm._leaveCb(),C&&C(t,T)},"transition-insert"),w&&w(t),A&&(Ot(t,b),Ot(t,$),At(function(){Tt(t,b),T.cancelled||O||St(t,i,T)})),e.data.show&&C&&C(t,T),A||O||T()}}}function Dt(e,t){function n(){m.cancelled||(e.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[e.key]=e),u&&u(r),v&&(Ot(r,s),Ot(r,c),At(function(){Tt(r,s),m.cancelled||h||St(r,o,m)})),l&&l(r,m),v||h||m())}var r=e.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var i=Mt(e.data.transition);if(!i)return t();if(!r._leaveCb&&1===r.nodeType){var a=i.css,o=i.type,s=i.leaveClass,c=i.leaveActiveClass,u=i.beforeLeave,l=i.leave,f=i.afterLeave,d=i.leaveCancelled,p=i.delayLeave,v=a!==!1&&!Dr,h=l&&(l._length||l.length)>1,m=r._leaveCb=Pt(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[e.key]=null),v&&Tt(r,c),m.cancelled?(v&&Tt(r,s),d&&d(r)):(t(),f&&f(r)),r._leaveCb=null});p?p(n):n()}}function Mt(e){if(e){if("object"==typeof e){var t={};return e.css!==!1&&u(t,na(e.name||"v")),u(t,e),t}return"string"==typeof e?na(e):void 0}}function Pt(e){var t=!1;return function(){t||(t=!0,e())}}function Rt(e,t,n){var r=t.value,i=e.multiple;if(!i||Array.isArray(r)){for(var a,o,s=0,c=e.options.length;s<c;s++)if(o=e.options[s],i)a=m(r,Bt(o))>-1,o.selected!==a&&(o.selected=a);else if(h(Bt(o),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function It(e,t){for(var n=0,r=t.length;n<r;n++)if(h(Bt(t[n]),e))return!1;return!0}function Bt(e){return"_value"in e?e._value:e.value}function Ft(e){e.target.composing=!0}function Ht(e){e.target.composing=!1,Ut(e.target,"input")}function Ut(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function zt(e){return!e.child||e.data&&e.data.transition?e:zt(e.child._vnode)}function Vt(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Vt(X(t.children)):e}function Jt(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var a in i)t[$r(a)]=i[a].fn;return t}function qt(e,t){return/\d-keep-alive$/.test(t.tag)?e("keep-alive"):null}function Kt(e){for(;e=e.parent;)if(e.data.transition)return!0}function Wt(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb(); -}function Zt(e){e.data.newPos=e.elm.getBoundingClientRect()}function Gt(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var a=e.elm.style;a.transform=a.WebkitTransform="translate("+r+"px,"+i+"px)",a.transitionDuration="0s"}}function Yt(e,t){var n=document.createElement("div");return n.innerHTML='<div a="'+e+'">',n.innerHTML.indexOf(t)>0}function Qt(e){return ma.innerHTML=e,ma.textContent}function Xt(e,t){return t&&(e=e.replace(Za,"\n")),e.replace(Ka,"<").replace(Wa,">").replace(Ga,"&").replace(Ya,'"')}function en(e,t){function n(t){f+=t,e=e.substring(t)}function r(){var t=e.match(Ca);if(t){var r={tagName:t[1],attrs:[],start:f};n(t[0].length);for(var i,a;!(i=e.match(xa))&&(a=e.match(ba));)n(a[0].length),r.attrs.push(a);if(i)return r.unarySlash=i[1],n(i[0].length),r.end=f,r}}function i(e){var n=e.tagName,r=e.unarySlash;u&&("p"===s&&Ti(n)&&a("",s),Oi(n)&&s===n&&a("",n));for(var i=l(n)||"html"===n&&"head"===s||!!r,o=e.attrs.length,f=new Array(o),d=0;d<o;d++){var p=e.attrs[d];Oa&&p[0].indexOf('""')===-1&&(""===p[3]&&delete p[3],""===p[4]&&delete p[4],""===p[5]&&delete p[5]);var v=p[3]||p[4]||p[5]||"";f[d]={name:p[1],value:Xt(v,t.shouldDecodeNewlines)}}i||(c.push({tag:n,attrs:f}),s=n,r=""),t.start&&t.start(n,f,i,e.start,e.end)}function a(e,n,r,i){var a;if(null==r&&(r=f),null==i&&(i=f),n){var o=n.toLowerCase();for(a=c.length-1;a>=0&&c[a].tag.toLowerCase()!==o;a--);}else a=0;if(a>=0){for(var u=c.length-1;u>=a;u--)t.end&&t.end(c[u].tag,r,i);c.length=a,s=a&&c[a-1].tag}else"br"===n.toLowerCase()?t.start&&t.start(n,[],!0,r,i):"p"===n.toLowerCase()&&(t.start&&t.start(n,[],!1,r,i),t.end&&t.end(n,r,i))}for(var o,s,c=[],u=t.expectHTML,l=t.isUnaryTag||Or,f=0;e;){if(o=e,s&&Ja(s)){var d=s.toLowerCase(),p=qa[d]||(qa[d]=new RegExp("([\\s\\S]*?)(</"+d+"[^>]*>)","i")),v=0,h=e.replace(p,function(e,n,r){return v=r.length,"script"!==d&&"style"!==d&&"noscript"!==d&&(n=n.replace(/<!--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g,"$1")),t.chars&&t.chars(n),""});f+=e.length-h.length,e=h,a("</"+d+">",d,f-v,f)}else{var m=e.indexOf("<");if(0===m){if(/^<!--/.test(e)){var g=e.indexOf("-->");if(g>=0){n(g+3);continue}}if(/^<!\[/.test(e)){var y=e.indexOf("]>");if(y>=0){n(y+2);continue}}var _=e.match(Aa);if(_){n(_[0].length);continue}var b=e.match(ka);if(b){var $=f;n(b[0].length),a(b[0],b[1],$,f);continue}var w=r();if(w){i(w);continue}}var C=void 0;m>=0?(C=e.substring(0,m),n(m)):(C=e,e=""),t.chars&&t.chars(C)}if(e===o)throw new Error("Error parsing template:\n\n"+e)}a()}function tn(e){function t(){(o||(o=[])).push(e.slice(d,i).trim()),d=i+1}var n,r,i,a,o,s=!1,c=!1,u=0,l=0,f=0,d=0;for(i=0;i<e.length;i++)if(r=n,n=e.charCodeAt(i),s)39===n&&92!==r&&(s=!s);else if(c)34===n&&92!==r&&(c=!c);else if(124!==n||124===e.charCodeAt(i+1)||124===e.charCodeAt(i-1)||u||l||f)switch(n){case 34:c=!0;break;case 39:s=!0;break;case 40:f++;break;case 41:f--;break;case 91:l++;break;case 93:l--;break;case 123:u++;break;case 125:u--}else void 0===a?(d=i+1,a=e.slice(0,i).trim()):t();if(void 0===a?a=e.slice(0,i).trim():0!==d&&t(),o)for(i=0;i<o.length;i++)a=nn(a,o[i]);return a}function nn(e,t){var n=t.indexOf("(");if(n<0)return'_f("'+t+'")('+e+")";var r=t.slice(0,n),i=t.slice(n+1);return'_f("'+r+'")('+e+","+i}function rn(e,t){var n=t?eo(t):Qa;if(n.test(e)){for(var r,i,a=[],o=n.lastIndex=0;r=n.exec(e);){i=r.index,i>o&&a.push(JSON.stringify(e.slice(o,i)));var s=tn(r[1].trim());a.push("_s("+s+")"),o=i+r[0].length}return o<e.length&&a.push(JSON.stringify(e.slice(o))),a.join("+")}}function an(e){console.error("[Vue parser]: "+e)}function on(e,t){return e?e.map(function(e){return e[t]}).filter(function(e){return e}):[]}function sn(e,t,n){(e.props||(e.props=[])).push({name:t,value:n})}function cn(e,t,n){(e.attrs||(e.attrs=[])).push({name:t,value:n})}function un(e,t,n,r,i,a){(e.directives||(e.directives=[])).push({name:t,rawName:n,value:r,arg:i,modifiers:a})}function ln(e,t,n,r,i){r&&r.capture&&(delete r.capture,t="!"+t);var a;r&&r.native?(delete r.native,a=e.nativeEvents||(e.nativeEvents={})):a=e.events||(e.events={});var o={value:n,modifiers:r},s=a[t];Array.isArray(s)?i?s.unshift(o):s.push(o):s?a[t]=i?[o,s]:[s,o]:a[t]=o}function fn(e,t,n){var r=dn(e,":"+t)||dn(e,"v-bind:"+t);if(null!=r)return r;if(n!==!1){var i=dn(e,t);if(null!=i)return JSON.stringify(i)}}function dn(e,t){var n;if(null!=(n=e.attrsMap[t]))for(var r=e.attrsList,i=0,a=r.length;i<a;i++)if(r[i].name===t){r.splice(i,1);break}return n}function pn(e,t){Ta=t.warn||an,Sa=t.getTagNamespace||Or,Ea=t.mustUseProp||Or,ja=t.isPreTag||Or,La=on(t.modules,"preTransformNode"),Na=on(t.modules,"transformNode"),Da=on(t.modules,"postTransformNode"),Ma=t.delimiters;var n,r,i=[],a=t.preserveWhitespace!==!1,o=!1,s=!1;return en(e,{expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,shouldDecodeNewlines:t.shouldDecodeNewlines,start:function(e,a,c){function u(e){}var l=r&&r.ns||Sa(e);t.isIE&&"svg"===l&&(a=En(a));var f={type:1,tag:e,attrsList:a,attrsMap:On(a,t.isIE),parent:r,children:[]};l&&(f.ns=l),Sn(f)&&(f.forbidden=!0);for(var d=0;d<La.length;d++)La[d](f,t);if(o||(vn(f),f.pre&&(o=!0)),ja(f.tag)&&(s=!0),o)hn(f);else{yn(f),_n(f),$n(f),mn(f),f.plain=!f.key&&!a.length,gn(f),wn(f),Cn(f);for(var p=0;p<Na.length;p++)Na[p](f,t);xn(f)}n||(n=f,u(n)),r&&!f.forbidden&&(f.else?bn(f,r):(r.children.push(f),f.parent=r)),c||(r=f,i.push(f));for(var v=0;v<Da.length;v++)Da[v](f,t)},end:function(){var e=i[i.length-1],t=e.children[e.children.length-1];t&&3===t.type&&" "===t.text&&e.children.pop(),i.length-=1,r=i[i.length-1],e.pre&&(o=!1),ja(e.tag)&&(s=!1)},chars:function(e){if(r&&(e=s||e.trim()?uo(e):a&&r.children.length?" ":"")){var t;!o&&" "!==e&&(t=rn(e,Ma))?r.children.push({type:2,expression:t,text:e}):(e=e.replace(co,""),r.children.push({type:3,text:e}))}}}),n}function vn(e){null!=dn(e,"v-pre")&&(e.pre=!0)}function hn(e){var t=e.attrsList.length;if(t)for(var n=e.attrs=new Array(t),r=0;r<t;r++)n[r]={name:e.attrsList[r].name,value:JSON.stringify(e.attrsList[r].value)};else e.pre||(e.plain=!0)}function mn(e){var t=fn(e,"key");t&&(e.key=t)}function gn(e){var t=fn(e,"ref");t&&(e.ref=t,e.refInFor=kn(e))}function yn(e){var t;if(t=dn(e,"v-for")){var n=t.match(no);if(!n)return;e.for=n[2].trim();var r=n[1].trim(),i=r.match(ro);i?(e.alias=i[1].trim(),e.iterator1=i[2].trim(),i[3]&&(e.iterator2=i[3].trim())):e.alias=r}}function _n(e){var t=dn(e,"v-if");t&&(e.if=t),null!=dn(e,"v-else")&&(e.else=!0)}function bn(e,t){var n=Tn(t.children);n&&n.if&&(n.elseBlock=e)}function $n(e){var t=dn(e,"v-once");null!=t&&(e.once=!0)}function wn(e){if("slot"===e.tag)e.slotName=fn(e,"name");else{var t=fn(e,"slot");t&&(e.slotTarget=t)}}function Cn(e){var t;(t=fn(e,"is"))&&(e.component=t),null!=dn(e,"inline-template")&&(e.inlineTemplate=!0)}function xn(e){var t,n,r,i,a,o,s,c,u=e.attrsList;for(t=0,n=u.length;t<n;t++)if(r=i=u[t].name,a=u[t].value,to.test(r))if(e.hasBindings=!0,s=An(r),s&&(r=r.replace(so,"")),io.test(r))r=r.replace(io,""),s&&s.prop&&(c=!0,r=$r(r),"innerHtml"===r&&(r="innerHTML")),c||Ea(r)?sn(e,r,a):cn(e,r,a);else if(ao.test(r))r=r.replace(ao,""),ln(e,r,a,s);else{r=r.replace(to,"");var l=r.match(oo);l&&(o=l[1])&&(r=r.slice(0,-(o.length+1))),un(e,r,i,a,o,s)}else cn(e,r,JSON.stringify(a))}function kn(e){for(var t=e;t;){if(void 0!==t.for)return!0;t=t.parent}return!1}function An(e){var t=e.match(so);if(t){var n={};return t.forEach(function(e){n[e.slice(1)]=!0}),n}}function On(e,t){for(var n={},r=0,i=e.length;r<i;r++)n[e[r].name]=e[r].value;return n}function Tn(e){for(var t=e.length;t--;)if(e[t].tag)return e[t]}function Sn(e){return"style"===e.tag||"script"===e.tag&&(!e.attrsMap.type||"text/javascript"===e.attrsMap.type)}function En(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];lo.test(r.name)||(r.name=r.name.replace(fo,""),t.push(r))}return t}function jn(e,t){e&&(Pa=po(t.staticKeys||""),Ra=t.isReservedTag||function(){return!1},Nn(e),Dn(e,!1))}function Ln(e){return n("type,tag,attrsList,attrsMap,plain,parent,children,attrs"+(e?","+e:""))}function Nn(e){if(e.static=Mn(e),1===e.type)for(var t=0,n=e.children.length;t<n;t++){var r=e.children[t];Nn(r),r.static||(e.static=!1)}}function Dn(e,t){if(1===e.type){if(e.once||e.static)return e.staticRoot=!0,void(e.staticInFor=t);if(e.children)for(var n=0,r=e.children.length;n<r;n++)Dn(e.children[n],t||!!e.for)}}function Mn(e){return 2!==e.type&&(3===e.type||!(!e.pre&&(e.hasBindings||e.if||e.for||yr(e.tag)||!Ra(e.tag)||Pn(e)||!Object.keys(e).every(Pa))))}function Pn(e){for(;e.parent;){if(e=e.parent,"template"!==e.tag)return!1;if(e.for)return!0}return!1}function Rn(e,t){var n=t?"nativeOn:{":"on:{";for(var r in e)n+='"'+r+'":'+In(e[r])+",";return n.slice(0,-1)+"}"}function In(e){if(e){if(Array.isArray(e))return"["+e.map(In).join(",")+"]";if(e.modifiers){var t="",n=[];for(var r in e.modifiers)mo[r]?t+=mo[r]:n.push(r);n.length&&(t=Bn(n)+t);var i=vo.test(e.value)?e.value+"($event)":e.value;return"function($event){"+t+i+"}"}return vo.test(e.value)?e.value:"function($event){"+e.value+"}"}return"function(){}"}function Bn(e){var t=1===e.length?Fn(e[0]):Array.prototype.concat.apply([],e.map(Fn));return Array.isArray(t)?"if("+t.map(function(e){return"$event.keyCode!=="+e}).join("&&")+")return;":"if($event.keyCode!=="+t+")return;"}function Fn(e){return parseInt(e,10)||ho[e]||"_k("+JSON.stringify(e)+")"}function Hn(e,t){e.wrapData=function(e){return"_b("+e+","+t.value+(t.modifiers&&t.modifiers.prop?",true":"")+")"}}function Un(e,t){var n=Ua,r=Ua=[];za=t,Ia=t.warn||an,Ba=on(t.modules,"transformCode"),Fa=on(t.modules,"genData"),Ha=t.directives||{};var i=e?zn(e):'_h("div")';return Ua=n,{render:"with(this){return "+i+"}",staticRenderFns:r}}function zn(e){if(e.staticRoot&&!e.staticProcessed)return e.staticProcessed=!0,Ua.push("with(this){return "+zn(e)+"}"),"_m("+(Ua.length-1)+(e.staticInFor?",true":"")+")";if(e.for&&!e.forProcessed)return qn(e);if(e.if&&!e.ifProcessed)return Vn(e);if("template"!==e.tag||e.slotTarget){if("slot"===e.tag)return Qn(e);var t;if(e.component)t=Xn(e);else{var n=Kn(e),r=e.inlineTemplate?null:Zn(e);t="_h('"+e.tag+"'"+(n?","+n:"")+(r?","+r:"")+")"}for(var i=0;i<Ba.length;i++)t=Ba[i](e,t);return t}return Zn(e)||"void 0"}function Vn(e){var t=e.if;return e.ifProcessed=!0,"("+t+")?"+zn(e)+":"+Jn(e)}function Jn(e){return e.elseBlock?zn(e.elseBlock):"_e()"}function qn(e){var t=e.for,n=e.alias,r=e.iterator1?","+e.iterator1:"",i=e.iterator2?","+e.iterator2:"";return e.forProcessed=!0,"_l(("+t+"),function("+n+r+i+"){return "+zn(e)+"})"}function Kn(e){if(!e.plain){var t="{",n=Wn(e);n&&(t+=n+","),e.key&&(t+="key:"+e.key+","),e.ref&&(t+="ref:"+e.ref+","),e.refInFor&&(t+="refInFor:true,"),e.component&&(t+='tag:"'+e.tag+'",'),e.slotTarget&&(t+="slot:"+e.slotTarget+",");for(var r=0;r<Fa.length;r++)t+=Fa[r](e);if(e.attrs&&(t+="attrs:{"+er(e.attrs)+"},"),e.props&&(t+="domProps:{"+er(e.props)+"},"),e.events&&(t+=Rn(e.events)+","),e.nativeEvents&&(t+=Rn(e.nativeEvents,!0)+","),e.inlineTemplate){var i=e.children[0];if(1===i.type){var a=Un(i,za);t+="inlineTemplate:{render:function(){"+a.render+"},staticRenderFns:["+a.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}return t=t.replace(/,$/,"")+"}",e.wrapData&&(t=e.wrapData(t)),t}}function Wn(e){var t=e.directives;if(t){var n,r,i,a,o="directives:[",s=!1;for(n=0,r=t.length;n<r;n++){i=t[n],a=!0;var c=Ha[i.name]||go[i.name];c&&(a=!!c(e,i,Ia)),a&&(s=!0,o+='{name:"'+i.name+'",rawName:"'+i.rawName+'"'+(i.value?",value:("+i.value+"),expression:"+JSON.stringify(i.value):"")+(i.arg?',arg:"'+i.arg+'"':"")+(i.modifiers?",modifiers:"+JSON.stringify(i.modifiers):"")+"},")}return s?o.slice(0,-1)+"]":void 0}}function Zn(e){if(e.children.length)return"["+e.children.map(Gn).join(",")+"]"}function Gn(e){return 1===e.type?zn(e):Yn(e)}function Yn(e){return 2===e.type?e.expression:JSON.stringify(e.text)}function Qn(e){var t=e.slotName||'"default"',n=Zn(e);return n?"_t("+t+","+n+")":"_t("+t+")"}function Xn(e){var t=e.inlineTemplate?null:Zn(e);return"_h("+e.component+","+Kn(e)+(t?","+t:"")+")"}function er(e){for(var t="",n=0;n<e.length;n++){var r=e[n];t+='"'+r.name+'":'+r.value+","}return t.slice(0,-1)}function tr(e,t){var n=pn(e.trim(),t);jn(n,t);var r=Un(n,t);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}}function nr(e,t){var n=(t.warn||an,dn(e,"class"));n&&(e.staticClass=JSON.stringify(n));var r=fn(e,"class",!1);r&&(e.classBinding=r)}function rr(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}function ir(e){var t=fn(e,"style",!1);t&&(e.styleBinding=t)}function ar(e){return e.styleBinding?"style:("+e.styleBinding+"),":""}function or(e,t,n){Va=n;var r=t.value,i=t.modifiers,a=e.tag,o=e.attrsMap.type;return"select"===a?lr(e,r):"input"===a&&"checkbox"===o?sr(e,r):"input"===a&&"radio"===o?cr(e,r):ur(e,r,i),!0}function sr(e,t){var n=fn(e,"value")||"null",r=fn(e,"true-value")||"true",i=fn(e,"false-value")||"false";sn(e,"checked","Array.isArray("+t+")?_i("+t+","+n+")>-1:_q("+t+","+r+")"),ln(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+r+"):("+i+");if(Array.isArray($$a)){var $$v="+n+",$$i=_i($$a,$$v);if($$c){$$i<0&&("+t+"=$$a.concat($$v))}else{$$i>-1&&("+t+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+t+"=$$c}",null,!0)}function cr(e,t){var n=fn(e,"value")||"null";sn(e,"checked","_q("+t+","+n+")"),ln(e,"change",t+"="+n,null,!0)}function ur(e,t,n){var r=e.attrsMap.type,i=n||{},a=i.lazy,o=i.number,s=i.trim,c=a||Nr&&"range"===r?"change":"input",u=!a&&"range"!==r,l="input"===e.tag||"textarea"===e.tag,f=l?"$event.target.value"+(s?".trim()":""):"$event",d=o||"number"===r?t+"=_n("+f+")":t+"="+f;l&&u&&(d="if($event.target.composing)return;"+d),sn(e,"value",l?"_s("+t+")":"("+t+")"),ln(e,c,d,null,!0)}function lr(e,t){var n=t+'=Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){return "_value" in o ? o._value : o.value})'+(null==e.attrsMap.multiple?"[0]":"");ln(e,"change",n,null,!0)}function fr(e,t){t.value&&sn(e,"textContent","_s("+t.value+")")}function dr(e,t){t.value&&sn(e,"innerHTML","_s("+t.value+")")}function pr(e,t){return t=t?u(u({},Co),t):Co,tr(e,t)}function vr(e,t,n){var r=(t&&t.warn||li,t&&t.delimiters?String(t.delimiters)+e:e);if(wo[r])return wo[r];var i={},a=pr(e,t);i.render=hr(a.render);var o=a.staticRenderFns.length;i.staticRenderFns=new Array(o);for(var s=0;s<o;s++)i.staticRenderFns[s]=hr(a.staticRenderFns[s]);return wo[r]=i}function hr(e){try{return new Function(e)}catch(e){return p}}function mr(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}var gr,yr=n("slot,component",!0),_r=Object.prototype.hasOwnProperty,br=/-(\w)/g,$r=o(function(e){return e.replace(br,function(e,t){return t?t.toUpperCase():""})}),wr=o(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),Cr=/([^-])([A-Z])/g,xr=o(function(e){return e.replace(Cr,"$1-$2").replace(Cr,"$1-$2").toLowerCase()}),kr=Object.prototype.toString,Ar="[object Object]",Or=function(){return!1},Tr={optionMergeStrategies:Object.create(null),silent:!1,devtools:!1,errorHandler:null,ignoredElements:null,keyCodes:Object.create(null),isReservedTag:Or,isUnknownElement:Or,getTagNamespace:p,mustUseProp:Or,_assetTypes:["component","directive","filter"],_lifecycleHooks:["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated"],_maxUpdateCount:100,_isServer:!1},Sr=/[^\w\.\$]/,Er="__proto__"in{},jr="undefined"!=typeof window&&"[object Object]"!==Object.prototype.toString.call(window),Lr=jr&&window.navigator.userAgent.toLowerCase(),Nr=Lr&&/msie|trident/.test(Lr),Dr=Lr&&Lr.indexOf("msie 9.0")>0,Mr=Lr&&Lr.indexOf("edge/")>0,Pr=Lr&&Lr.indexOf("android")>0,Rr=Lr&&/iphone|ipad|ipod|ios/.test(Lr),Ir=jr&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Br=function(){function e(){r=!1;var e=n.slice(0);n.length=0;for(var t=0;t<e.length;t++)e[t]()}var t,n=[],r=!1;if("undefined"!=typeof Promise&&b(Promise)){var i=Promise.resolve();t=function(){i.then(e),Rr&&setTimeout(p)}}else if("undefined"==typeof MutationObserver||!b(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())t=function(){setTimeout(e,0)};else{var a=1,o=new MutationObserver(e),s=document.createTextNode(String(a));o.observe(s,{characterData:!0}),t=function(){a=(a+1)%2,s.data=String(a)}}return function(e,i){var a=i?function(){e.call(i)}:e;n.push(a),r||(r=!0,t())}}();gr="undefined"!=typeof Set&&b(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return void 0!==this.set[e]},e.prototype.add=function(e){this.set[e]=1},e.prototype.clear=function(){this.set=Object.create(null)},e}();var Fr=0,Hr=function(){this.id=Fr++,this.subs=[]};Hr.prototype.addSub=function(e){this.subs.push(e)},Hr.prototype.removeSub=function(e){r(this.subs,e)},Hr.prototype.depend=function(){Hr.target&&Hr.target.addDep(this)},Hr.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},Hr.target=null;var Ur=[],zr=[],Vr={},Jr=!1,qr=!1,Kr=0,Wr=0,Zr=function(e,t,n,r){void 0===r&&(r={}),this.vm=e,e._watchers.push(this),this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.expression=t.toString(),this.cb=n,this.id=++Wr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new gr,this.newDepIds=new gr,"function"==typeof t?this.getter=t:(this.getter=_(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};Zr.prototype.get=function(){$(this);var e=this.getter.call(this.vm,this.vm);return this.deep&&A(e),w(),this.cleanupDeps(),e},Zr.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},Zr.prototype.cleanupDeps=function(){for(var e=this,t=this.deps.length;t--;){var n=e.deps[t];e.newDepIds.has(n.id)||n.removeSub(e)}var r=this.depIds;this.depIds=this.newDepIds,this.newDepIds=r,this.newDepIds.clear(),r=this.deps,this.deps=this.newDeps,this.newDeps=r,this.newDeps.length=0},Zr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():k(this)},Zr.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||l(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){if(!Tr.errorHandler)throw e;Tr.errorHandler.call(null,e,this.vm)}else this.cb.call(this.vm,e,t)}}},Zr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Zr.prototype.depend=function(){for(var e=this,t=this.deps.length;t--;)e.deps[t].depend()},Zr.prototype.teardown=function(){var e=this;if(this.active){this.vm._isBeingDestroyed||this.vm._vForRemoving||r(this.vm._watchers,this);for(var t=this.deps.length;t--;)e.deps[t].removeSub(e);this.active=!1}};var Gr=new gr,Yr=Array.prototype,Qr=Object.create(Yr);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=Yr[e];y(Qr,e,function(){for(var n=arguments,r=arguments.length,i=new Array(r);r--;)i[r]=n[r];var a,o=t.apply(this,i),s=this.__ob__;switch(e){case"push":a=i;break;case"unshift":a=i;break;case"splice":a=i.slice(2)}return a&&s.observeArray(a),s.dep.notify(),o})});var Xr=Object.getOwnPropertyNames(Qr),ei={shouldConvert:!0,isSettingProps:!1},ti=function(e){if(this.value=e,this.dep=new Hr,this.vmCount=0,y(e,"__ob__",this),Array.isArray(e)){var t=Er?O:T;t(e,Qr,Xr),this.observeArray(e)}else this.walk(e)};ti.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)E(e,t[n],e[t[n]])},ti.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)S(e[t])};var ni={enumerable:!0,configurable:!0,get:p,set:p},ri=function(e,t,n,r,i,a,o,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=i,this.ns=a,this.context=o,this.functionalContext=void 0,this.key=t&&t.key,this.componentOptions=s,this.child=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1},ii=function(){var e=new ri;return e.text="",e.isComment=!0,e},ai=null,oi={init:oe,prepatch:se,insert:ce,destroy:ue},si=Object.keys(oi),ci=0;we(Ce),U(Ce),$e(Ce),te(Ce),ye(Ce);var ui,li=p,fi=Tr.optionMergeStrategies;fi.data=function(e,t,n){return n?e||t?function(){var r="function"==typeof t?t.call(n):t,i="function"==typeof e?e.call(n):void 0;return r?xe(r,i):i}:void 0:t?"function"!=typeof t?e:e?function(){return xe(t.call(this),e.call(this))}:t:e},Tr._lifecycleHooks.forEach(function(e){fi[e]=ke}),Tr._assetTypes.forEach(function(e){fi[e+"s"]=Ae}),fi.watch=function(e,t){if(!t)return e;if(!e)return t;var n={};u(n,e);for(var r in t){var i=n[r],a=t[r];i&&!Array.isArray(i)&&(i=[i]),n[r]=i?i.concat(a):[a]}return n},fi.props=fi.methods=fi.computed=function(e,t){if(!t)return e;if(!e)return t;var n=Object.create(null);return u(n,e),u(n,t),n};var di=function(e,t){return void 0===t?e:t},pi=Object.freeze({defineReactive:E,_toString:e,toNumber:t,makeMap:n,isBuiltInTag:yr,remove:r,hasOwn:i,isPrimitive:a,cached:o,camelize:$r,capitalize:wr,hyphenate:xr,bind:s,toArray:c,extend:u,isObject:l,isPlainObject:f,toObject:d,noop:p,no:Or,genStaticKeys:v,looseEqual:h,looseIndexOf:m,isReserved:g,def:y,parsePath:_,hasProto:Er,inBrowser:jr,UA:Lr,isIE:Nr,isIE9:Dr,isEdge:Mr,isAndroid:Pr,isIOS:Rr,devtools:Ir,nextTick:Br,get _Set(){return gr},mergeOptions:Ee,resolveAsset:je,warn:li,formatComponentName:ui,validateProp:Le}),vi={name:"keep-alive",abstract:!0,created:function(){this.cache=Object.create(null)},render:function(){var e=X(this.$slots.default);if(e&&e.componentOptions){var t=e.componentOptions,n=null==e.key?t.Ctor.cid+"::"+t.tag:e.key;this.cache[n]?e.child=this.cache[n].child:this.cache[n]=e,e.data.keepAlive=!0}return e},destroyed:function(){var e=this;for(var t in this.cache){var n=e.cache[t];ne(n.child,"deactivated"),n.child.$destroy()}}},hi={KeepAlive:vi};Fe(Ce),Object.defineProperty(Ce.prototype,"$isServer",{get:function(){return Tr._isServer}}),Ce.version="2.0.3";var mi,gi=n("value,selected,checked,muted"),yi=n("contenteditable,draggable,spellcheck"),_i=n("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),bi="http://www.w3.org/1999/xlink",$i=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},wi=function(e){return $i(e)?e.slice(6,e.length):""},Ci=function(e){return null==e||e===!1},xi={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},ki=n("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template"),Ai=n("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr",!0),Oi=n("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source",!0),Ti=n("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track",!0),Si=n("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font,font-face,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),Ei=function(e){return"pre"===e},ji=function(e){return ki(e)||Si(e)},Li=Object.create(null),Ni=Object.freeze({createElement:Ze,createElementNS:Ge,createTextNode:Ye,createComment:Qe,insertBefore:Xe,removeChild:et,appendChild:tt,parentNode:nt,nextSibling:rt,tagName:it,setTextContent:at,childNodes:ot,setAttribute:st}),Di={create:function(e,t){ct(t)},update:function(e,t){e.data.ref!==t.data.ref&&(ct(e,!0),ct(t))},destroy:function(e){ct(e,!0)}},Mi=new ri("",{},[]),Pi=["create","update","remove","destroy"],Ri={create:vt,update:vt,destroy:function(e){vt(e,Mi)}},Ii=Object.create(null),Bi=[Di,Ri],Fi={create:yt,update:yt},Hi={create:bt,update:bt},Ui={create:$t,update:$t},zi={create:wt,update:wt},Vi=["Webkit","Moz","ms"],Ji=o(function(e){if(mi=mi||document.createElement("div"),e=$r(e),"filter"!==e&&e in mi.style)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<Vi.length;n++){var r=Vi[n]+t;if(r in mi.style)return r}}),qi={create:Ct,update:Ct},Ki=jr&&!Dr,Wi="transition",Zi="animation",Gi="transition",Yi="transitionend",Qi="animation",Xi="animationend";Ki&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Gi="WebkitTransition",Yi="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Qi="WebkitAnimation",Xi="webkitAnimationEnd"));var ea=jr&&window.requestAnimationFrame||setTimeout,ta=/\b(transform|all)(,|$)/,na=o(function(e){return{enterClass:e+"-enter",leaveClass:e+"-leave",appearClass:e+"-enter",enterActiveClass:e+"-enter-active",leaveActiveClass:e+"-leave-active",appearActiveClass:e+"-enter-active"}}),ra=jr?{create:function(e,t){t.data.show||Nt(t)},remove:function(e,t){e.data.show?t():Dt(e,t)}}:{},ia=[Fi,Hi,Ui,zi,qi,ra],aa=ia.concat(Bi),oa=pt({nodeOps:Ni,modules:aa});Dr&&document.addEventListener("selectionchange",function(){var e=document.activeElement;e&&e.vmodel&&Ut(e,"input")});var sa={inserted:function(e,t,n){if("select"===n.tag){var r=function(){Rt(e,t,n.context)};r(),(Nr||Mr)&&setTimeout(r,0)}else"textarea"!==n.tag&&"text"!==e.type||t.modifiers.lazy||(Pr||(e.addEventListener("compositionstart",Ft),e.addEventListener("compositionend",Ht)),Dr&&(e.vmodel=!0))},componentUpdated:function(e,t,n){if("select"===n.tag){Rt(e,t,n.context);var r=e.multiple?t.value.some(function(t){return It(t,e.options)}):t.value!==t.oldValue&&It(t.value,e.options);r&&Ut(e,"change")}}},ca={bind:function(e,t,n){var r=t.value;n=zt(n);var i=n.data&&n.data.transition;r&&i&&!Dr&&Nt(n);var a="none"===e.style.display?"":e.style.display;e.style.display=r?a:"none",e.__vOriginalDisplay=a},update:function(e,t,n){var r=t.value,i=t.oldValue;if(r!==i){n=zt(n);var a=n.data&&n.data.transition;a&&!Dr?r?(Nt(n),e.style.display=e.__vOriginalDisplay):Dt(n,function(){e.style.display="none"}):e.style.display=r?e.__vOriginalDisplay:"none"}}},ua={model:sa,show:ca},la={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String},fa={name:"transition",props:la,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(function(e){return e.tag}),n.length)){var r=this.mode,i=n[0];if(Kt(this.$vnode))return i;var a=Vt(i);if(!a)return i;if(this._leaving)return qt(e,i);var o=a.key=null==a.key||a.isStatic?"__v"+(a.tag+this._uid)+"__":a.key,s=(a.data||(a.data={})).transition=Jt(this),c=this._vnode,l=Vt(c);if(a.data.directives&&a.data.directives.some(function(e){return"show"===e.name})&&(a.data.show=!0),l&&l.data&&l.key!==o){var f=l.data.transition=u({},s);if("out-in"===r)return this._leaving=!0,q(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()},o),qt(e,i);if("in-out"===r){var d,p=function(){d()};q(s,"afterEnter",p,o),q(s,"enterCancelled",p,o),q(f,"delayLeave",function(e){d=e},o)}}return i}}},da=u({tag:String,moveClass:String},la);delete da.mode;var pa={props:da,render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],a=this.children=[],o=Jt(this),s=0;s<i.length;s++){var c=i[s];c.tag&&null!=c.key&&0!==String(c.key).indexOf("__vlist")&&(a.push(c),n[c.key]=c,(c.data||(c.data={})).transition=o)}if(r){for(var u=[],l=[],f=0;f<r.length;f++){var d=r[f];d.data.transition=o,d.data.pos=d.elm.getBoundingClientRect(),n[d.key]?u.push(d):l.push(d)}this.kept=e(t,null,u),this.removed=l}return e(t,null,a)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var e=this.prevChildren,t=this.moveClass||this.name+"-move";if(e.length&&this.hasMove(e[0].elm,t)){e.forEach(Wt),e.forEach(Zt),e.forEach(Gt);document.body.offsetHeight;e.forEach(function(e){if(e.data.moved){var n=e.elm,r=n.style;Ot(n,t),r.transform=r.WebkitTransform=r.transitionDuration="",n.addEventListener(Yi,n._moveCb=function e(r){r&&!/transform$/.test(r.propertyName)||(n.removeEventListener(Yi,e),n._moveCb=null,Tt(n,t))})}})}},methods:{hasMove:function(e,t){if(!Ki)return!1;if(null!=this._hasMove)return this._hasMove;Ot(e,t);var n=Et(e);return Tt(e,t),this._hasMove=n.hasTransform}}},va={Transition:fa,TransitionGroup:pa};Ce.config.isUnknownElement=Ke,Ce.config.isReservedTag=ji,Ce.config.getTagNamespace=qe,Ce.config.mustUseProp=gi,u(Ce.options.directives,ua),u(Ce.options.components,va),Ce.prototype.__patch__=Tr._isServer?p:oa,Ce.prototype.$mount=function(e,t){return e=e&&!Tr._isServer?We(e):void 0,this._mount(e,t)},setTimeout(function(){Tr.devtools&&Ir&&Ir.emit("init",Ce)},0);var ha=!!jr&&Yt("\n"," "),ma=document.createElement("div"),ga=/([^\s"'<>\/=]+)/,ya=/(?:=)/,_a=[/"([^"]*)"+/.source,/'([^']*)'+/.source,/([^\s"'=<>`]+)/.source],ba=new RegExp("^\\s*"+ga.source+"(?:\\s*("+ya.source+")\\s*(?:"+_a.join("|")+"))?"),$a="[a-zA-Z_][\\w\\-\\.]*",wa="((?:"+$a+"\\:)?"+$a+")",Ca=new RegExp("^<"+wa),xa=/^\s*(\/?)>/,ka=new RegExp("^<\\/"+wa+"[^>]*>"),Aa=/^<!DOCTYPE [^>]+>/i,Oa=!1;"x".replace(/x(.)?/g,function(e,t){Oa=""===t});var Ta,Sa,Ea,ja,La,Na,Da,Ma,Pa,Ra,Ia,Ba,Fa,Ha,Ua,za,Va,Ja=n("script,style",!0),qa={},Ka=/</g,Wa=/>/g,Za=/ /g,Ga=/&/g,Ya=/"/g,Qa=/\{\{((?:.|\n)+?)\}\}/g,Xa=/[-.*+?^${}()|[\]\/\\]/g,eo=o(function(e){var t=e[0].replace(Xa,"\\$&"),n=e[1].replace(Xa,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}),to=/^v-|^@|^:/,no=/(.*?)\s+(?:in|of)\s+(.*)/,ro=/\(([^,]*),([^,]*)(?:,([^,]*))?\)/,io=/^:|^v-bind:/,ao=/^@|^v-on:/,oo=/:(.*)$/,so=/\.[^\.]+/g,co=/\u2028|\u2029/g,uo=o(Qt),lo=/^xmlns:NS\d+/,fo=/^NS\d+:/,po=o(Ln),vo=/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?'\]|\[".*?"\]|\[\d+\]|\[[A-Za-z_$][\w$]*\])*\s*$/,ho={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},mo={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:"if($event.target !== $event.currentTarget)return;"},go={bind:Hn,cloak:p},yo=(new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),{staticKeys:["staticClass"],transformNode:nr,genData:rr}),_o={transformNode:ir,genData:ar},bo=[yo,_o],$o={model:or,text:fr,html:dr},wo=Object.create(null),Co={isIE:Nr,expectHTML:!0,modules:bo,staticKeys:v(bo),directives:$o,isReservedTag:ji,isUnaryTag:Ai,mustUseProp:gi,getTagNamespace:qe,isPreTag:Ei},xo=o(function(e){var t=We(e);return t&&t.innerHTML}),ko=Ce.prototype.$mount;return Ce.prototype.$mount=function(e,t){if(e=e&&We(e),e===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=xo(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=mr(e));if(r){var i=vr(r,{warn:li,shouldDecodeNewlines:ha,delimiters:n.delimiters},this),a=i.render,o=i.staticRenderFns;n.render=a,n.staticRenderFns=o}}return ko.call(this,e,t)},Ce.compile=vr,Ce}); \ No newline at end of file diff --git a/public/router.php b/public/router.php deleted file mode 100644 index 6ba1fab..0000000 --- a/public/router.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- -// $Id$ - -if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["REQUEST_URI"])) { - return false; -} else { - require __DIR__ . "/index.php"; -} diff --git a/think b/think deleted file mode 100644 index 8afa938..0000000 --- a/think +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env php -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -// 定义项目路径 -define('APP_PATH', __DIR__ . '/application/'); - -// 加载框架引导文件 -require './thinkphp/console.php'; \ No newline at end of file diff --git a/thinkphp/base.php b/thinkphp/base.php deleted file mode 100755 index 5bd1b40..0000000 --- a/thinkphp/base.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -define('THINK_VERSION', '5.0.3'); -define('THINK_START_TIME', microtime(true)); -define('THINK_START_MEM', memory_get_usage()); -define('EXT', '.php'); -define('DS', DIRECTORY_SEPARATOR); -defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS); -define('LIB_PATH', THINK_PATH . 'library' . DS); -define('CORE_PATH', LIB_PATH . 'think' . DS); -define('TRAIT_PATH', LIB_PATH . 'traits' . DS); -defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS); -defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS); -defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS); -defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS); -defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS); -defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS); -defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS); -defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS); -defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录 -defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀 -defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀 - -// 环境常量 -define('IS_CLI', PHP_SAPI == 'cli' ? true : false); -define('IS_WIN', strpos(PHP_OS, 'WIN') !== false); - -// 载入Loader类 -require CORE_PATH . 'Loader.php'; - -// 加载环境变量配置文件 -if (is_file(ROOT_PATH . '.env')) { - $env = parse_ini_file(ROOT_PATH . '.env', true); - foreach ($env as $key => $val) { - $name = ENV_PREFIX . strtoupper($key); - if (is_array($val)) { - foreach ($val as $k => $v) { - $item = $name . '_' . strtoupper($k); - putenv("$item=$v"); - } - } else { - putenv("$name=$val"); - } - } -} - -// 注册自动加载 -\think\Loader::register(); - -// 注册错误和异常处理机制 -\think\Error::register(); - -// 加载惯例配置文件 -\think\Config::set(include THINK_PATH . 'convention' . EXT); diff --git a/thinkphp/console.php b/thinkphp/console.php deleted file mode 100755 index 3d518e7..0000000 --- a/thinkphp/console.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think; - -// ThinkPHP 引导文件 -// 加载基础文件 -require __DIR__ . '/base.php'; - -// 执行应用 -App::initCommon(); -Console::init(); \ No newline at end of file diff --git a/thinkphp/convention.php b/thinkphp/convention.php deleted file mode 100755 index 8eb30f4..0000000 --- a/thinkphp/convention.php +++ /dev/null @@ -1,274 +0,0 @@ -<?php - -return [ - // +---------------------------------------------------------------------- - // | 应用设置 - // +---------------------------------------------------------------------- - - // 应用命名空间 - 'app_namespace' => 'app', - // 应用调试模式 - 'app_debug' => true, - // 应用Trace - 'app_trace' => false, - // 应用模式状态 - 'app_status' => '', - // 是否支持多模块 - 'app_multi_module' => true, - // 入口自动绑定模块 - 'auto_bind_module' => false, - // 注册的根命名空间 - 'root_namespace' => [], - // 扩展函数文件 - 'extra_file_list' => [THINK_PATH . 'helper' . EXT], - // 默认输出类型 - 'default_return_type' => 'html', - // 默认AJAX 数据返回格式,可选json xml ... - 'default_ajax_return' => 'json', - // 默认JSONP格式返回的处理方法 - 'default_jsonp_handler' => 'jsonpReturn', - // 默认JSONP处理方法 - 'var_jsonp_handler' => 'callback', - // 默认时区 - 'default_timezone' => 'PRC', - // 是否开启多语言 - '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_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' => '/', - // URL伪静态后缀 - 'url_html_suffix' => 'html', - // URL普通方式参数 用于自动生成 - 'url_common_param' => false, - // URL参数方式 0 按名称成对解析 1 按顺序解析 - 'url_param_type' => 0, - // 是否开启路由 - 'url_route_on' => true, - // 路由配置文件(支持配置多个) - 'route_config_file' => ['route'], - // 路由使用完整匹配 - 'route_complete_match' => false, - // 是否强制使用路由 - 'url_route_must' => false, - // 域名部署 - 'url_domain_deploy' => 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, - - // +---------------------------------------------------------------------- - // | 模板设置 - // +---------------------------------------------------------------------- - - 'template' => [ - // 模板引擎类型 支持 php think 支持扩展 - 'type' => 'Think', - // 模板路径 - 'view_path' => '', - // 模板后缀 - 'view_suffix' => 'html', - // 模板文件名分隔符 - 'view_depr' => DS, - // 模板引擎普通标签开始标记 - 'tpl_begin' => '{', - // 模板引擎普通标签结束标记 - 'tpl_end' => '}', - // 标签库标签开始标记 - 'taglib_begin' => '{', - // 标签库标签结束标记 - 'taglib_end' => '}', - ], - - // 视图输出字符串内容替换 - 'view_replace_str' => [], - // 默认跳转页面对应的模板文件 - 'dispatch_success_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl', - 'dispatch_error_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl', - - // +---------------------------------------------------------------------- - // | 异常及错误设置 - // +---------------------------------------------------------------------- - - // 异常页面的模板文件 - 'exception_tmpl' => THINK_PATH . 'tpl' . DS . 'think_exception.tpl', - - // 错误显示信息,非调试模式有效 - 'error_message' => '页面错误!请稍后再试~', - // 显示错误信息 - 'show_error_msg' => false, - // 异常处理handle类 留空使用 \think\exception\Handle - 'exception_handle' => '', - - // +---------------------------------------------------------------------- - // | 日志设置 - // +---------------------------------------------------------------------- - - 'log' => [ - // 日志记录方式,内置 file socket 支持扩展 - 'type' => 'File', - // 日志保存目录 - 'path' => LOG_PATH, - // 日志记录级别 - 'level' => [], - ], - - // +---------------------------------------------------------------------- - // | Trace设置 开启 app_trace 后 有效 - // +---------------------------------------------------------------------- - 'trace' => [ - // 内置Html Console 支持扩展 - 'type' => 'Html', - ], - - // +---------------------------------------------------------------------- - // | 缓存设置 - // +---------------------------------------------------------------------- - - 'cache' => [ - // 驱动方式 - 'type' => 'File', - // 缓存保存目录 - 'path' => CACHE_PATH, - // 缓存前缀 - 'prefix' => '', - // 缓存有效期 0表示永久缓存 - 'expire' => 0, - ], - - // +---------------------------------------------------------------------- - // | 会话设置 - // +---------------------------------------------------------------------- - - 'session' => [ - 'id' => '', - // SESSION_ID的提交变量,解决flash上传跨域 - 'var_session_id' => '', - // SESSION 前缀 - 'prefix' => 'think', - // 驱动方式 支持redis memcache memcached - 'type' => '', - // 是否自动开启 SESSION - 'auto_start' => true, - ], - - // +---------------------------------------------------------------------- - // | Cookie设置 - // +---------------------------------------------------------------------- - 'cookie' => [ - // cookie 名称前缀 - 'prefix' => '', - // cookie 保存时间 - 'expire' => 0, - // cookie 保存路径 - 'path' => '/', - // cookie 有效域名 - 'domain' => '', - // cookie 启用安全传输 - 'secure' => false, - // httponly设置 - 'httponly' => '', - // 是否使用 setcookie - 'setcookie' => true, - ], - - // +---------------------------------------------------------------------- - // | 数据库设置 - // +---------------------------------------------------------------------- - - 'database' => [ - // 数据库类型 - 'type' => 'mysql', - // 数据库连接DSN配置 - 'dsn' => '', - // 服务器地址 - 'hostname' => 'localhost', - // 数据库名 - 'database' => '', - // 数据库用户名 - 'username' => 'root', - // 数据库密码 - 'password' => '', - // 数据库连接端口 - 'hostport' => '', - // 数据库连接参数 - 'params' => [], - // 数据库编码默认采用utf8 - 'charset' => 'utf8', - // 数据库表前缀 - 'prefix' => '', - // 数据库调试模式 - 'debug' => false, - // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'deploy' => 0, - // 数据库读写是否分离 主从式有效 - 'rw_separate' => false, - // 读写分离后 主服务器数量 - 'master_num' => 1, - // 指定从服务器序号 - 'slave_no' => '', - // 是否严格检查字段是否存在 - 'fields_strict' => true, - // 自动写入时间戳字段 - 'auto_timestamp' => false, - ], - - //分页配置 - 'paginate' => [ - 'type' => 'bootstrap', - 'var_page' => 'page', - 'list_rows' => 15, - ], - -]; diff --git a/thinkphp/helper.php b/thinkphp/helper.php deleted file mode 100755 index b81970c..0000000 --- a/thinkphp/helper.php +++ /dev/null @@ -1,550 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -//------------------------ -// ThinkPHP 助手函数 -//------------------------- - -use think\Cache; -use think\Config; -use think\Cookie; -use think\Db; -use think\Debug; -use think\exception\HttpException; -use think\exception\HttpResponseException; -use think\Lang; -use think\Loader; -use think\Log; -use think\Request; -use think\Response; -use think\Session; -use think\Url; -use think\View; - -if (!function_exists('load_trait')) { - /** - * 快速导入Traits PHP5.5以上无需调用 - * @param string $class trait库 - * @param string $ext 类库后缀 - * @return boolean - */ - function load_trait($class, $ext = EXT) - { - return Loader::import($class, TRAIT_PATH, $ext); - } -} - -if (!function_exists('exception')) { - /** - * 抛出异常处理 - * - * @param string $msg 异常消息 - * @param integer $code 异常代码 默认为0 - * @param string $exception 异常类 - * - * @throws Exception - */ - function exception($msg, $code = 0, $exception = '') - { - $e = $exception ?: '\think\Exception'; - throw new $e($msg, $code); - } -} - -if (!function_exists('debug')) { - /** - * 记录时间(微秒)和内存使用情况 - * @param string $start 开始标签 - * @param string $end 结束标签 - * @param integer|string $dec 小数位 如果是m 表示统计内存占用 - * @return mixed - */ - function debug($start, $end = '', $dec = 6) - { - if ('' == $end) { - Debug::remark($start); - } else { - return 'm' == $dec ? Debug::getRangeMem($start, $end) : Debug::getRangeTime($start, $end, $dec); - } - } -} - -if (!function_exists('lang')) { - /** - * 获取语言变量值 - * @param string $name 语言变量名 - * @param array $vars 动态变量值 - * @param string $lang 语言 - * @return mixed - */ - function lang($name, $vars = [], $lang = '') - { - return Lang::get($name, $vars, $lang); - } -} - -if (!function_exists('config')) { - /** - * 获取和设置配置参数 - * @param string|array $name 参数名 - * @param mixed $value 参数值 - * @param string $range 作用域 - * @return mixed - */ - function config($name = '', $value = null, $range = '') - { - if (is_null($value) && is_string($name)) { - return 0 === strpos($name, '?') ? Config::has(substr($name, 1), $range) : Config::get($name, $range); - } else { - return Config::set($name, $value, $range); - } - } -} - -if (!function_exists('input')) { - /** - * 获取输入数据 支持默认值和过滤 - * @param string $key 获取的变量名 - * @param mixed $default 默认值 - * @param string $filter 过滤方法 - * @return mixed - */ - function input($key = '', $default = null, $filter = '') - { - if (0 === strpos($key, '?')) { - $key = substr($key, 1); - $has = true; - } - if ($pos = strpos($key, '.')) { - // 指定参数来源 - list($method, $key) = explode('.', $key); - if (!in_array($method, ['get', 'post', 'put', 'patch', 'delete', 'param', 'request', 'session', 'cookie', 'server', 'env', 'path', 'file'])) { - $key = $method . '.' . $key; - $method = 'param'; - } - } else { - // 默认为自动判断 - $method = 'param'; - } - if (isset($has)) { - return request()->has($key, $method, $default); - } else { - return request()->$method($key, $default, $filter); - } - } -} - -if (!function_exists('widget')) { - /** - * 渲染输出Widget - * @param string $name Widget名称 - * @param array $data 传入的参数 - * @return mixed - */ - function widget($name, $data = []) - { - return Loader::action($name, $data, 'widget'); - } -} - -if (!function_exists('model')) { - /** - * 实例化Model - * @param string $name Model名称 - * @param string $layer 业务层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @return \think\Model - */ - function model($name = '', $layer = 'model', $appendSuffix = false) - { - return Loader::model($name, $layer, $appendSuffix); - } -} - -if (!function_exists('validate')) { - /** - * 实例化验证器 - * @param string $name 验证器名称 - * @param string $layer 业务层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @return \think\Validate - */ - function validate($name = '', $layer = 'validate', $appendSuffix = false) - { - return Loader::validate($name, $layer, $appendSuffix); - } -} - -if (!function_exists('db')) { - /** - * 实例化数据库类 - * @param string $name 操作的数据表名称(不含前缀) - * @param array|string $config 数据库配置参数 - * @param bool $force 是否强制重新连接 - * @return \think\db\Query - */ - function db($name = '', $config = [], $force = true) - { - return Db::connect($config, $force)->name($name); - } -} - -if (!function_exists('controller')) { - /** - * 实例化控制器 格式:[模块/]控制器 - * @param string $name 资源地址 - * @param string $layer 控制层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @return \think\Controller - */ - function controller($name, $layer = 'controller', $appendSuffix = false) - { - return Loader::controller($name, $layer, $appendSuffix); - } -} - -if (!function_exists('action')) { - /** - * 调用模块的操作方法 参数格式 [模块/控制器/]操作 - * @param string $url 调用地址 - * @param string|array $vars 调用参数 支持字符串和数组 - * @param string $layer 要调用的控制层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @return mixed - */ - function action($url, $vars = [], $layer = 'controller', $appendSuffix = false) - { - return Loader::action($url, $vars, $layer, $appendSuffix); - } -} - -if (!function_exists('import')) { - /** - * 导入所需的类库 同java的Import 本函数有缓存功能 - * @param string $class 类库命名空间字符串 - * @param string $baseUrl 起始路径 - * @param string $ext 导入的文件扩展名 - * @return boolean - */ - function import($class, $baseUrl = '', $ext = EXT) - { - return Loader::import($class, $baseUrl, $ext); - } -} - -if (!function_exists('vendor')) { - /** - * 快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面 - * @param string $class 类库 - * @param string $ext 类库后缀 - * @return boolean - */ - function vendor($class, $ext = EXT) - { - return Loader::import($class, VENDOR_PATH, $ext); - } -} - -if (!function_exists('dump')) { - /** - * 浏览器友好的变量输出 - * @param mixed $var 变量 - * @param boolean $echo 是否输出 默认为true 如果为false 则返回输出字符串 - * @param string $label 标签 默认为空 - * @return void|string - */ - function dump($var, $echo = true, $label = null) - { - return Debug::dump($var, $echo, $label); - } -} - -if (!function_exists('url')) { - /** - * Url生成 - * @param string $url 路由地址 - * @param string|array $vars 变量 - * @param bool|string $suffix 生成的URL后缀 - * @param bool|string $domain 域名 - * @return string - */ - function url($url = '', $vars = '', $suffix = true, $domain = false) - { - return Url::build($url, $vars, $suffix, $domain); - } -} - -if (!function_exists('session')) { - /** - * Session管理 - * @param string|array $name session名称,如果为数组表示进行session设置 - * @param mixed $value session值 - * @param string $prefix 前缀 - * @return mixed - */ - function session($name, $value = '', $prefix = null) - { - if (is_array($name)) { - // 初始化 - Session::init($name); - } elseif (is_null($name)) { - // 清除 - Session::clear('' === $value ? null : $value); - } elseif ('' === $value) { - // 判断或获取 - return 0 === strpos($name, '?') ? Session::has(substr($name, 1), $prefix) : Session::get($name, $prefix); - } elseif (is_null($value)) { - // 删除 - return Session::delete($name, $prefix); - } else { - // 设置 - return Session::set($name, $value, $prefix); - } - } -} - -if (!function_exists('cookie')) { - /** - * Cookie管理 - * @param string|array $name cookie名称,如果为数组表示进行cookie设置 - * @param mixed $value cookie值 - * @param mixed $option 参数 - * @return mixed - */ - function cookie($name, $value = '', $option = null) - { - if (is_array($name)) { - // 初始化 - Cookie::init($name); - } elseif (is_null($name)) { - // 清除 - Cookie::clear($value); - } elseif ('' === $value) { - // 获取 - return 0 === strpos($name, '?') ? Cookie::has(substr($name, 1), $option) : Cookie::get($name); - } elseif (is_null($value)) { - // 删除 - return Cookie::delete($name); - } else { - // 设置 - return Cookie::set($name, $value, $option); - } - } -} - -if (!function_exists('cache')) { - /** - * 缓存管理 - * @param mixed $name 缓存名称,如果为数组表示进行缓存设置 - * @param mixed $value 缓存值 - * @param mixed $options 缓存参数 - * @param string $tag 缓存标签 - * @return mixed - */ - function cache($name, $value = '', $options = null, $tag = null) - { - if (is_array($options)) { - // 缓存操作的同时初始化 - Cache::connect($options); - } elseif (is_array($name)) { - // 缓存初始化 - return Cache::connect($name); - } - if (is_null($name)) { - return Cache::clear($value); - } elseif ('' === $value) { - // 获取缓存 - return 0 === strpos($name, '?') ? Cache::has(substr($name, 1)) : Cache::get($name); - } elseif (is_null($value)) { - // 删除缓存 - return Cache::rm($name); - } elseif (0 === strpos($name, '?') && '' !== $value) { - $expire = is_numeric($options) ? $options : null; - return Cache::remember(substr($name, 1), $value, $expire); - } else { - // 缓存数据 - if (is_array($options)) { - $expire = isset($options['expire']) ? $options['expire'] : null; //修复查询缓存无法设置过期时间 - } else { - $expire = is_numeric($options) ? $options : null; //默认快捷缓存设置过期时间 - } - if (is_null($tag)) { - return Cache::set($name, $value, $expire); - } else { - return Cache::tag($tag)->set($name, $value, $expire); - } - } - } -} - -if (!function_exists('trace')) { - /** - * 记录日志信息 - * @param mixed $log log信息 支持字符串和数组 - * @param string $level 日志级别 - * @return void|array - */ - function trace($log = '[think]', $level = 'log') - { - if ('[think]' === $log) { - return Log::getLog(); - } else { - Log::record($log, $level); - } - } -} - -if (!function_exists('request')) { - /** - * 获取当前Request对象实例 - * @return Request - */ - function request() - { - return Request::instance(); - } -} - -if (!function_exists('response')) { - /** - * 创建普通 Response 对象实例 - * @param mixed $data 输出数据 - * @param int|string $code 状态码 - * @param array $header 头信息 - * @param string $type - * @return Response - */ - function response($data = [], $code = 200, $header = [], $type = 'html') - { - return Response::create($data, $type, $code, $header); - } -} - -if (!function_exists('view')) { - /** - * 渲染模板输出 - * @param string $template 模板文件 - * @param array $vars 模板变量 - * @param array $replace 模板替换 - * @param integer $code 状态码 - * @return \think\response\View - */ - function view($template = '', $vars = [], $replace = [], $code = 200) - { - return Response::create($template, 'view', $code)->replace($replace)->assign($vars); - } -} - -if (!function_exists('json')) { - /** - * 获取\think\response\Json对象实例 - * @param mixed $data 返回的数据 - * @param integer $code 状态码 - * @param array $header 头部 - * @param array $options 参数 - * @return \think\response\Json - */ - function json($data = [], $code = 200, $header = [], $options = []) - { - return Response::create($data, 'json', $code, $header, $options); - } -} - -if (!function_exists('jsonp')) { - /** - * 获取\think\response\Jsonp对象实例 - * @param mixed $data 返回的数据 - * @param integer $code 状态码 - * @param array $header 头部 - * @param array $options 参数 - * @return \think\response\Jsonp - */ - function jsonp($data = [], $code = 200, $header = [], $options = []) - { - return Response::create($data, 'jsonp', $code, $header, $options); - } -} - -if (!function_exists('xml')) { - /** - * 获取\think\response\Xml对象实例 - * @param mixed $data 返回的数据 - * @param integer $code 状态码 - * @param array $header 头部 - * @param array $options 参数 - * @return \think\response\Xml - */ - function xml($data = [], $code = 200, $header = [], $options = []) - { - return Response::create($data, 'xml', $code, $header, $options); - } -} - -if (!function_exists('redirect')) { - /** - * 获取\think\response\Redirect对象实例 - * @param mixed $url 重定向地址 支持Url::build方法的地址 - * @param array|integer $params 额外参数 - * @param integer $code 状态码 - * @return \think\response\Redirect - */ - function redirect($url = [], $params = [], $code = 302) - { - if (is_integer($params)) { - $code = $params; - $params = []; - } - return Response::create($url, 'redirect', $code)->params($params); - } -} - -if (!function_exists('abort')) { - /** - * 抛出HTTP异常 - * @param integer|Response $code 状态码 或者 Response对象实例 - * @param string $message 错误信息 - * @param array $header 参数 - */ - function abort($code, $message = null, $header = []) - { - if ($code instanceof Response) { - throw new HttpResponseException($code); - } else { - throw new HttpException($code, $message, null, $header); - } - } -} - -if (!function_exists('halt')) { - /** - * 调试变量并且中断输出 - * @param mixed $var 调试变量或者信息 - */ - function halt($var) - { - dump($var); - throw new HttpResponseException(new Response); - } -} - -if (!function_exists('token')) { - /** - * 生成表单令牌 - * @param string $name 令牌名称 - * @param mixed $type 令牌生成方法 - * @return string - */ - function token($name = '__token__', $type = 'md5') - { - $token = Request::instance()->token($name, $type); - return '<input type="hidden" name="' . $name . '" value="' . $token . '" />'; - } -} diff --git a/thinkphp/lang/zh-cn.php b/thinkphp/lang/zh-cn.php deleted file mode 100755 index db43a1c..0000000 --- a/thinkphp/lang/zh-cn.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -// 核心中文语言包 -return [ - // 系统错误提示 - 'Undefined variable' => '未定义变量', - 'Undefined index' => '未定义数组索引', - 'Undefined offset' => '未定义数组下标', - 'Parse error' => '语法解析错误', - 'Type error' => '类型错误', - 'Fatal error' => '致命错误', - 'syntax error' => '语法错误', - - // 框架核心错误提示 - 'dispatch type not support' => '不支持的调度类型', - 'method param miss' => '方法参数错误', - 'method not exists' => '方法不存在', - 'module not exists' => '模块不存在', - 'controller not exists' => '控制器不存在', - 'class not exists' => '类不存在', - 'property not exists' => '类的属性不存在', - 'template not exists' => '模板文件不存在', - 'illegal controller name' => '非法的控制器名称', - 'illegal action name' => '非法的操作名称', - 'url suffix deny' => '禁止的URL后缀访问', - 'Route Not Found' => '当前访问路由未定义', - 'Underfined db type' => '未定义数据库类型', - 'variable type error' => '变量类型错误', - 'PSR-4 error' => 'PSR-4 规范错误', - 'not support total' => '简洁模式下不能获取数据总数', - 'not support last' => '简洁模式下不能获取最后一页', - 'error session handler' => '错误的SESSION处理器类', - 'not allow php tag' => '模板不允许使用PHP语法', - 'not support' => '不支持', - 'redisd master' => 'Redisd 主服务器错误', - 'redisd slave' => 'Redisd 从服务器错误', - 'must run at sae' => '必须在SAE运行', - 'memcache init error' => '未开通Memcache服务,请在SAE管理平台初始化Memcache服务', - 'KVDB init error' => '没有初始化KVDB,请在SAE管理平台初始化KVDB服务', - 'fields not exists' => '数据表字段不存在', - 'where express error' => '查询表达式错误', - 'no data to update' => '没有任何数据需要更新', - 'miss data to insert' => '缺少需要写入的数据', - 'miss complex primary data' => '缺少复合主键数据', - 'miss update condition' => '缺少更新条件', - 'model data Not Found' => '模型数据不存在', - 'table data not Found' => '表数据不存在', - 'delete without condition' => '没有条件不会执行删除操作', - 'miss relation data' => '缺少关联表数据', - 'tag attr must' => '模板标签属性必须', - 'tag error' => '模板标签错误', - 'cache write error' => '缓存写入失败', - 'sae mc write error' => 'SAE mc 写入错误', - 'route name not exists' => '路由标识不存在(或参数不够)', - 'invalid request' => '非法请求', -]; diff --git a/thinkphp/library/think/App.php b/thinkphp/library/think/App.php deleted file mode 100755 index 4eddc7c..0000000 --- a/thinkphp/library/think/App.php +++ /dev/null @@ -1,575 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\Config; -use think\Env; -use think\Exception; -use think\exception\HttpException; -use think\exception\HttpResponseException; -use think\exception\RouteNotFoundException; -use think\Hook; -use think\Lang; -use think\Loader; -use think\Log; -use think\Request; -use think\Response; -use think\Route; - -/** - * App 应用管理 - * @author liu21st <liu21st@gmail.com> - */ -class App -{ - /** - * @var bool 是否初始化过 - */ - protected static $init = false; - - /** - * @var string 当前模块路径 - */ - public static $modulePath; - - /** - * @var bool 应用调试模式 - */ - public static $debug = true; - - /** - * @var string 应用类库命名空间 - */ - public static $namespace = 'app'; - - /** - * @var bool 应用类库后缀 - */ - public static $suffix = false; - - /** - * @var bool 应用路由检测 - */ - protected static $routeCheck; - - /** - * @var bool 严格路由检测 - */ - protected static $routeMust; - - protected static $dispatch; - protected static $file = []; - - /** - * 执行应用程序 - * @access public - * @param Request $request Request对象 - * @return Response - * @throws Exception - */ - public static function run(Request $request = null) - { - is_null($request) && $request = Request::instance(); - - try { - $config = self::initCommon(); - if (defined('BIND_MODULE')) { - // 模块/控制器绑定 - BIND_MODULE && Route::bind(BIND_MODULE); - } elseif ($config['auto_bind_module']) { - // 入口自动绑定 - $name = pathinfo($request->baseFile(), PATHINFO_FILENAME); - if ($name && 'index' != $name && is_dir(APP_PATH . $name)) { - Route::bind($name); - } - } - - $request->filter($config['default_filter']); - - if ($config['lang_switch_on']) { - // 开启多语言机制 检测当前语言 - Lang::detect(); - } else { - // 读取默认语言 - Lang::range($config['default_lang']); - } - $request->langset(Lang::range()); - // 加载系统语言包 - Lang::load([ - THINK_PATH . 'lang' . DS . $request->langset() . EXT, - APP_PATH . 'lang' . DS . $request->langset() . EXT, - ]); - - // 获取应用调度信息 - $dispatch = self::$dispatch; - if (empty($dispatch)) { - // 进行URL路由检测 - $dispatch = self::routeCheck($request, $config); - } - // 记录当前调度信息 - $request->dispatch($dispatch); - - // 记录路由和请求信息 - if (self::$debug) { - Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info'); - Log::record('[ HEADER ] ' . var_export($request->header(), true), 'info'); - Log::record('[ PARAM ] ' . var_export($request->param(), true), 'info'); - } - - // 监听app_begin - Hook::listen('app_begin', $dispatch); - // 请求缓存检查 - $request->cache($config['request_cache'], $config['request_cache_expire']); - - switch ($dispatch['type']) { - case 'redirect': - // 执行重定向跳转 - $data = Response::create($dispatch['url'], 'redirect')->code($dispatch['status']); - break; - case 'module': - // 模块/控制器/操作 - $data = self::module($dispatch['module'], $config, isset($dispatch['convert']) ? $dispatch['convert'] : null); - break; - case 'controller': - // 执行控制器操作 - $data = Loader::action($dispatch['controller']); - break; - case 'method': - // 执行回调方法 - $data = self::invokeMethod($dispatch['method']); - break; - case 'function': - // 执行闭包 - $data = self::invokeFunction($dispatch['function']); - break; - case 'response': - $data = $dispatch['response']; - break; - default: - throw new \InvalidArgumentException('dispatch type not support'); - } - } catch (HttpResponseException $exception) { - $data = $exception->getResponse(); - } - - // 清空类的实例化 - Loader::clearInstance(); - - // 输出数据到客户端 - if ($data instanceof Response) { - $response = $data; - } elseif (!is_null($data)) { - // 默认自动识别响应输出类型 - $isAjax = $request->isAjax(); - $type = $isAjax ? Config::get('default_ajax_return') : Config::get('default_return_type'); - $response = Response::create($data, $type); - } else { - $response = Response::create(); - } - - // 监听app_end - Hook::listen('app_end', $response); - - return $response; - } - - /** - * 设置当前请求的调度信息 - * @access public - * @param array|string $dispatch 调度信息 - * @param string $type 调度类型 - * @return void - */ - public static function dispatch($dispatch, $type = 'module') - { - self::$dispatch = ['type' => $type, $type => $dispatch]; - } - - /** - * 执行函数或者闭包方法 支持参数调用 - * @access public - * @param string|array|\Closure $function 函数或者闭包 - * @param array $vars 变量 - * @return mixed - */ - public static function invokeFunction($function, $vars = []) - { - $reflect = new \ReflectionFunction($function); - $args = self::bindParams($reflect, $vars); - // 记录执行信息 - self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info'); - return $reflect->invokeArgs($args); - } - - /** - * 调用反射执行类的方法 支持参数绑定 - * @access public - * @param string|array $method 方法 - * @param array $vars 变量 - * @return mixed - */ - public static function invokeMethod($method, $vars = []) - { - if (is_array($method)) { - $class = is_object($method[0]) ? $method[0] : new $method[0](Request::instance()); - $reflect = new \ReflectionMethod($class, $method[1]); - } else { - // 静态方法 - $reflect = new \ReflectionMethod($method); - } - $args = self::bindParams($reflect, $vars); - - self::$debug && Log::record('[ RUN ] ' . $reflect->class . '->' . $reflect->name . '[ ' . $reflect->getFileName() . ' ]', 'info'); - return $reflect->invokeArgs(isset($class) ? $class : null, $args); - } - - /** - * 调用反射执行类的实例化 支持依赖注入 - * @access public - * @param string $class 类名 - * @param array $vars 变量 - * @return mixed - */ - public static function invokeClass($class, $vars = []) - { - $reflect = new \ReflectionClass($class); - $constructor = $reflect->getConstructor(); - if ($constructor) { - $args = self::bindParams($constructor, $vars); - } else { - $args = []; - } - return $reflect->newInstanceArgs($args); - } - - /** - * 绑定参数 - * @access public - * @param \ReflectionMethod|\ReflectionFunction $reflect 反射类 - * @param array $vars 变量 - * @return array - */ - private static function bindParams($reflect, $vars = []) - { - if (empty($vars)) { - // 自动获取请求变量 - if (Config::get('url_param_type')) { - $vars = Request::instance()->route(); - } else { - $vars = Request::instance()->param(); - } - } - $args = []; - // 判断数组类型 数字数组时按顺序绑定参数 - reset($vars); - $type = key($vars) === 0 ? 1 : 0; - if ($reflect->getNumberOfParameters() > 0) { - $params = $reflect->getParameters(); - foreach ($params as $param) { - $name = $param->getName(); - $class = $param->getClass(); - if ($class) { - $className = $class->getName(); - $bind = Request::instance()->$name; - if ($bind instanceof $className) { - $args[] = $bind; - } else { - if (method_exists($className, 'invoke')) { - $method = new \ReflectionMethod($className, 'invoke'); - if ($method->isPublic() && $method->isStatic()) { - $args[] = $className::invoke(Request::instance()); - continue; - } - } - $args[] = method_exists($className, 'instance') ? $className::instance() : new $className; - } - } elseif (1 == $type && !empty($vars)) { - $args[] = array_shift($vars); - } elseif (0 == $type && isset($vars[$name])) { - $args[] = $vars[$name]; - } elseif ($param->isDefaultValueAvailable()) { - $args[] = $param->getDefaultValue(); - } else { - throw new \InvalidArgumentException('method param miss:' . $name); - } - } - // 全局过滤 - array_walk_recursive($args, [Request::instance(), 'filterExp']); - } - return $args; - } - - /** - * 执行模块 - * @access public - * @param array $result 模块/控制器/操作 - * @param array $config 配置参数 - * @param bool $convert 是否自动转换控制器和操作名 - * @return mixed - */ - public static function module($result, $config, $convert = null) - { - if (is_string($result)) { - $result = explode('/', $result); - } - $request = Request::instance(); - if ($config['app_multi_module']) { - // 多模块部署 - $module = strip_tags(strtolower($result[0] ?: $config['default_module'])); - $bind = Route::getBind('module'); - $available = false; - if ($bind) { - // 绑定模块 - list($bindModule) = explode('/', $bind); - if (empty($result[0])) { - $module = $bindModule; - $available = true; - } elseif ($module == $bindModule) { - $available = true; - } - } elseif (!in_array($module, $config['deny_module_list']) && is_dir(APP_PATH . $module)) { - $available = true; - } - - // 模块初始化 - if ($module && $available) { - // 初始化模块 - $request->module($module); - $config = self::init($module); - } else { - throw new HttpException(404, 'module not exists:' . $module); - } - } else { - // 单一模块部署 - $module = ''; - $request->module($module); - } - // 当前模块路径 - App::$modulePath = APP_PATH . ($module ? $module . DS : ''); - - // 是否自动转换控制器和操作名 - $convert = is_bool($convert) ? $convert : $config['url_convert']; - // 获取控制器名 - $controller = strip_tags($result[1] ?: $config['default_controller']); - $controller = $convert ? strtolower($controller) : $controller; - - // 获取操作名 - $actionName = strip_tags($result[2] ?: $config['default_action']); - $actionName = $convert ? strtolower($actionName) : $actionName; - - // 设置当前请求的控制器、操作 - $request->controller(Loader::parseName($controller, 1))->action($actionName); - - // 监听module_init - Hook::listen('module_init', $request); - - $instance = Loader::controller($controller, $config['url_controller_layer'], $config['controller_suffix'], $config['empty_controller']); - if (is_null($instance)) { - throw new HttpException(404, 'controller not exists:' . Loader::parseName($controller, 1)); - } - // 获取当前操作名 - $action = $actionName . $config['action_suffix']; - - $vars = []; - if (is_callable([$instance, $action])) { - // 执行操作方法 - $call = [$instance, $action]; - } elseif (is_callable([$instance, '_empty'])) { - // 空操作 - $call = [$instance, '_empty']; - $vars = [$action]; - } else { - // 操作不存在 - throw new HttpException(404, 'method not exists:' . get_class($instance) . '->' . $action . '()'); - } - - Hook::listen('action_begin', $call); - - return self::invokeMethod($call, $vars); - } - - /** - * 初始化应用 - */ - public static function initCommon() - { - if (empty(self::$init)) { - // 初始化应用 - $config = self::init(); - self::$suffix = $config['class_suffix']; - - // 应用调试模式 - self::$debug = Env::get('app_debug', Config::get('app_debug')); - if (!self::$debug) { - ini_set('display_errors', 'Off'); - } elseif (!IS_CLI) { - //重新申请一块比较大的buffer - if (ob_get_level() > 0) { - $output = ob_get_clean(); - } - ob_start(); - if (!empty($output)) { - echo $output; - } - } - - // 注册应用命名空间 - self::$namespace = $config['app_namespace']; - Loader::addNamespace($config['app_namespace'], APP_PATH); - if (!empty($config['root_namespace'])) { - Loader::addNamespace($config['root_namespace']); - } - - // 加载额外文件 - if (!empty($config['extra_file_list'])) { - foreach ($config['extra_file_list'] as $file) { - $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; - if (is_file($file) && !isset(self::$file[$file])) { - include $file; - self::$file[$file] = true; - } - } - } - - // 设置系统时区 - date_default_timezone_set($config['default_timezone']); - - // 监听app_init - Hook::listen('app_init'); - - self::$init = $config; - } - return self::$init; - } - - /** - * 初始化应用或模块 - * @access public - * @param string $module 模块名 - * @return array - */ - private static function init($module = '') - { - // 定位模块目录 - $module = $module ? $module . DS : ''; - - // 加载初始化文件 - if (is_file(APP_PATH . $module . 'init' . EXT)) { - include APP_PATH . $module . 'init' . EXT; - } elseif (is_file(RUNTIME_PATH . $module . 'init' . EXT)) { - include RUNTIME_PATH . $module . 'init' . EXT; - } else { - $path = APP_PATH . $module; - // 加载模块配置 - $config = Config::load(CONF_PATH . $module . 'config' . CONF_EXT); - // 读取数据库配置文件 - $filename = CONF_PATH . $module . 'database' . CONF_EXT; - Config::load($filename, 'database'); - // 读取扩展配置文件 - if (is_dir(CONF_PATH . $module . 'extra')) { - $dir = CONF_PATH . $module . 'extra'; - $files = scandir($dir); - foreach ($files as $file) { - if (strpos($file, CONF_EXT)) { - $filename = $dir . DS . $file; - Config::load($filename, pathinfo($file, PATHINFO_FILENAME)); - } - } - } - - // 加载应用状态配置 - if ($config['app_status']) { - $config = Config::load(CONF_PATH . $module . $config['app_status'] . CONF_EXT); - } - - // 加载行为扩展文件 - if (is_file(CONF_PATH . $module . 'tags' . EXT)) { - Hook::import(include CONF_PATH . $module . 'tags' . EXT); - } - - // 加载公共文件 - if (is_file($path . 'common' . EXT)) { - include $path . 'common' . EXT; - } - - // 加载当前模块语言包 - if ($module) { - Lang::load($path . 'lang' . DS . Request::instance()->langset() . EXT); - } - } - return Config::get(); - } - - /** - * URL路由检测(根据PATH_INFO) - * @access public - * @param \think\Request $request - * @param array $config - * @return array - * @throws \think\Exception - */ - public static function routeCheck($request, array $config) - { - $path = $request->path(); - $depr = $config['pathinfo_depr']; - $result = false; - // 路由检测 - $check = !is_null(self::$routeCheck) ? self::$routeCheck : $config['url_route_on']; - if ($check) { - // 开启路由 - if (is_file(RUNTIME_PATH . 'route.php')) { - // 读取路由缓存 - $rules = include RUNTIME_PATH . 'route.php'; - if (is_array($rules)) { - Route::rules($rules); - } - } else { - $files = $config['route_config_file']; - foreach ($files as $file) { - if (is_file(CONF_PATH . $file . CONF_EXT)) { - // 导入路由配置 - $rules = include CONF_PATH . $file . CONF_EXT; - if (is_array($rules)) { - Route::import($rules); - } - } - } - } - - // 路由检测(根据路由定义返回不同的URL调度) - $result = Route::check($request, $path, $depr, $config['url_domain_deploy']); - $must = !is_null(self::$routeMust) ? self::$routeMust : $config['url_route_must']; - if ($must && false === $result) { - // 路由无效 - throw new RouteNotFoundException(); - } - } - if (false === $result) { - // 路由无效 解析模块/控制器/操作/参数... 支持控制器自动搜索 - $result = Route::parseUrl($path, $depr, $config['controller_auto_search']); - } - return $result; - } - - /** - * 设置应用的路由检测机制 - * @access public - * @param bool $route 是否需要检测路由 - * @param bool $must 是否强制检测路由 - * @return void - */ - public static function route($route, $must = false) - { - self::$routeCheck = $route; - self::$routeMust = $must; - } -} diff --git a/thinkphp/library/think/Build.php b/thinkphp/library/think/Build.php deleted file mode 100755 index dd2bd55..0000000 --- a/thinkphp/library/think/Build.php +++ /dev/null @@ -1,204 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -class Build -{ - /** - * 根据传入的build资料创建目录和文件 - * @access protected - * @param array $build build列表 - * @param string $namespace 应用类库命名空间 - * @param bool $suffix 类库后缀 - * @return void - */ - public static function run(array $build = [], $namespace = 'app', $suffix = false) - { - // 锁定 - $lockfile = APP_PATH . 'build.lock'; - if (is_writable($lockfile)) { - return; - } elseif (!touch($lockfile)) { - throw new Exception('应用目录[' . APP_PATH . ']不可写,目录无法自动生成!<BR>请手动生成项目目录~', 10006); - } - foreach ($build as $module => $list) { - if ('__dir__' == $module) { - // 创建目录列表 - self::buildDir($list); - } elseif ('__file__' == $module) { - // 创建文件列表 - self::buildFile($list); - } else { - // 创建模块 - self::module($module, $list, $namespace, $suffix); - } - } - // 解除锁定 - unlink($lockfile); - } - - /** - * 创建目录 - * @access protected - * @param array $list 目录列表 - * @return void - */ - protected static function buildDir($list) - { - foreach ($list as $dir) { - if (!is_dir(APP_PATH . $dir)) { - // 创建目录 - mkdir(APP_PATH . $dir, 0755, true); - } - } - } - - /** - * 创建文件 - * @access protected - * @param array $list 文件列表 - * @return void - */ - protected static function buildFile($list) - { - foreach ($list as $file) { - if (!is_dir(APP_PATH . dirname($file))) { - // 创建目录 - mkdir(APP_PATH . dirname($file), 0755, true); - } - if (!is_file(APP_PATH . $file)) { - file_put_contents(APP_PATH . $file, 'php' == pathinfo($file, PATHINFO_EXTENSION) ? "<?php\n" : ''); - } - } - } - - /** - * 创建模块 - * @access public - * @param string $module 模块名 - * @param array $list build列表 - * @param string $namespace 应用类库命名空间 - * @param bool $suffix 类库后缀 - * @return void - */ - public static function module($module = '', $list = [], $namespace = 'app', $suffix = false) - { - $module = $module ? $module : ''; - if (!is_dir(APP_PATH . $module)) { - // 创建模块目录 - mkdir(APP_PATH . $module); - } - if (basename(RUNTIME_PATH) != $module) { - // 创建配置文件和公共文件 - self::buildCommon($module); - // 创建模块的默认页面 - self::buildHello($module, $namespace, $suffix); - } - if (empty($list)) { - // 创建默认的模块目录和文件 - $list = [ - '__file__' => ['config.php', 'common.php'], - '__dir__' => ['controller', 'model', 'view'], - ]; - } - // 创建子目录和文件 - foreach ($list as $path => $file) { - $modulePath = APP_PATH . $module . DS; - if ('__dir__' == $path) { - // 生成子目录 - foreach ($file as $dir) { - if (!is_dir($modulePath . $dir)) { - // 创建目录 - mkdir($modulePath . $dir, 0755, true); - } - } - } elseif ('__file__' == $path) { - // 生成(空白)文件 - foreach ($file as $name) { - if (!is_file($modulePath . $name)) { - file_put_contents($modulePath . $name, 'php' == pathinfo($name, PATHINFO_EXTENSION) ? "<?php\n" : ''); - } - } - } else { - // 生成相关MVC文件 - foreach ($file as $val) { - $val = trim($val); - $filename = $modulePath . $path . DS . $val . ($suffix ? ucfirst($path) : '') . EXT; - $space = $namespace . '\\' . ($module ? $module . '\\' : '') . $path; - $class = $val . ($suffix ? ucfirst($path) : ''); - switch ($path) { - case 'controller': // 控制器 - $content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}"; - break; - case 'model': // 模型 - $content = "<?php\nnamespace {$space};\n\nuse think\Model;\n\nclass {$class} extends Model\n{\n\n}"; - break; - case 'view': // 视图 - $filename = $modulePath . $path . DS . $val . '.html'; - if (!is_dir(dirname($filename))) { - // 创建目录 - mkdir(dirname($filename), 0755, true); - } - $content = ''; - break; - default: - // 其他文件 - $content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}"; - } - - if (!is_file($filename)) { - file_put_contents($filename, $content); - } - } - } - } - } - - /** - * 创建模块的欢迎页面 - * @access public - * @param string $module 模块名 - * @param string $namespace 应用类库命名空间 - * @param bool $suffix 类库后缀 - * @return void - */ - protected static function buildHello($module, $namespace, $suffix = false) - { - $filename = APP_PATH . ($module ? $module . DS : '') . 'controller' . DS . 'Index' . ($suffix ? 'Controller' : '') . EXT; - if (!is_file($filename)) { - $content = file_get_contents(THINK_PATH . 'tpl' . DS . 'default_index.tpl'); - $content = str_replace(['{$app}', '{$module}', '{layer}', '{$suffix}'], [$namespace, $module ? $module . '\\' : '', 'controller', $suffix ? 'Controller' : ''], $content); - if (!is_dir(dirname($filename))) { - mkdir(dirname($filename), 0755, true); - } - file_put_contents($filename, $content); - } - } - - /** - * 创建模块的公共文件 - * @access public - * @param string $module 模块名 - * @return void - */ - protected static function buildCommon($module) - { - $filename = CONF_PATH . ($module ? $module . DS : '') . 'config.php'; - if (!is_file($filename)) { - file_put_contents($filename, "<?php\n//配置文件\nreturn [\n\n];"); - } - $filename = APP_PATH . ($module ? $module . DS : '') . 'common.php'; - if (!is_file($filename)) { - file_put_contents($filename, "<?php\n"); - } - } -} diff --git a/thinkphp/library/think/Cache.php b/thinkphp/library/think/Cache.php deleted file mode 100755 index a5ac0b3..0000000 --- a/thinkphp/library/think/Cache.php +++ /dev/null @@ -1,202 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\App; - -class Cache -{ - protected static $instance = []; - public static $readTimes = 0; - public static $writeTimes = 0; - - /** - * 操作句柄 - * @var object - * @access protected - */ - protected static $handler; - - /** - * 连接缓存 - * @access public - * @param array $options 配置数组 - * @param bool|string $name 缓存连接标识 true 强制重新连接 - * @return \think\cache\Driver - */ - public static function connect(array $options = [], $name = false) - { - $type = !empty($options['type']) ? $options['type'] : 'File'; - if (false === $name) { - $name = md5(serialize($options)); - } - - if (true === $name || !isset(self::$instance[$name])) { - $class = false !== strpos($type, '\\') ? $type : '\\think\\cache\\driver\\' . ucwords($type); - - // 记录初始化信息 - App::$debug && Log::record('[ CACHE ] INIT ' . $type, 'info'); - if (true === $name) { - return new $class($options); - } else { - self::$instance[$name] = new $class($options); - } - } - self::$handler = self::$instance[$name]; - return self::$handler; - } - - /** - * 自动初始化缓存 - * @access public - * @param array $options 配置数组 - * @return void - */ - public static function init(array $options = []) - { - if (is_null(self::$handler)) { - // 自动初始化缓存 - if (!empty($options)) { - self::connect($options); - } elseif ('complex' == Config::get('cache.type')) { - self::connect(Config::get('cache.default')); - } else { - self::connect(Config::get('cache')); - } - } - } - - /** - * 切换缓存类型 需要配置 cache.type 为 complex - * @access public - * @param string $name 缓存标识 - * @return \think\cache\Driver - */ - public static function store($name) - { - if ('complex' == Config::get('cache.type')) { - self::connect(Config::get('cache.' . $name), strtolower($name)); - } - return self::$handler; - } - - /** - * 判断缓存是否存在 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public static function has($name) - { - self::init(); - self::$readTimes++; - return self::$handler->has($name); - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存标识 - * @param mixed $default 默认值 - * @return mixed - */ - public static function get($name, $default = false) - { - self::init(); - self::$readTimes++; - return self::$handler->get($name, $default); - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存标识 - * @param mixed $value 存储数据 - * @param int|null $expire 有效时间 0为永久 - * @return boolean - */ - public static function set($name, $value, $expire = null) - { - self::init(); - self::$writeTimes++; - return self::$handler->set($name, $value, $expire); - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public static function inc($name, $step = 1) - { - self::init(); - self::$writeTimes++; - return self::$handler->inc($name, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public static function dec($name, $step = 1) - { - self::init(); - self::$writeTimes++; - return self::$handler->dec($name, $step); - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存标识 - * @return boolean - */ - public static function rm($name) - { - self::init(); - self::$writeTimes++; - return self::$handler->rm($name); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return boolean - */ - public static function clear($tag = null) - { - self::init(); - self::$writeTimes++; - return self::$handler->clear($tag); - } - - /** - * 缓存标签 - * @access public - * @param string $name 标签名 - * @param string|array $keys 缓存标识 - * @param bool $overlay 是否覆盖 - * @return \think\cache\Driver - */ - public static function tag($name, $keys = null, $overlay = false) - { - self::init(); - return self::$handler->tag($name, $keys, $overlay); - } - -} diff --git a/thinkphp/library/think/Collection.php b/thinkphp/library/think/Collection.php deleted file mode 100755 index 8315268..0000000 --- a/thinkphp/library/think/Collection.php +++ /dev/null @@ -1,373 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: zhangyajun <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think; - -use ArrayAccess; -use ArrayIterator; -use Countable; -use IteratorAggregate; -use JsonSerializable; - -class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable -{ - protected $items = []; - - public function __construct($items = []) - { - $this->items = $this->convertToArray($items); - } - - public static function make($items = []) - { - return new static($items); - } - - /** - * 是否为空 - * @return bool - */ - public function isEmpty() - { - return empty($this->items); - } - - public function toArray() - { - return array_map(function ($value) { - return ($value instanceof Model || $value instanceof self) ? $value->toArray() : $value; - }, $this->items); - } - - public function all() - { - return $this->items; - } - - /** - * 合并数组 - * - * @param mixed $items - * @return static - */ - public function merge($items) - { - return new static(array_merge($this->items, $this->convertToArray($items))); - } - - /** - * 比较数组,返回差集 - * - * @param mixed $items - * @return static - */ - public function diff($items) - { - return new static(array_diff($this->items, $this->convertToArray($items))); - } - - /** - * 交换数组中的键和值 - * - * @return static - */ - public function flip() - { - return new static(array_flip($this->items)); - } - - /** - * 比较数组,返回交集 - * - * @param mixed $items - * @return static - */ - public function intersect($items) - { - return new static(array_intersect($this->items, $this->convertToArray($items))); - } - - /** - * 返回数组中所有的键名 - * - * @return static - */ - public function keys() - { - return new static(array_keys($this->items)); - } - - /** - * 删除数组的最后一个元素(出栈) - * - * @return mixed - */ - public function pop() - { - return array_pop($this->items); - } - - /** - * 通过使用用户自定义函数,以字符串返回数组 - * - * @param callable $callback - * @param mixed $initial - * @return mixed - */ - public function reduce(callable $callback, $initial = null) - { - return array_reduce($this->items, $callback, $initial); - } - - /** - * 以相反的顺序返回数组。 - * - * @return static - */ - public function reverse() - { - return new static(array_reverse($this->items)); - } - - /** - * 删除数组中首个元素,并返回被删除元素的值 - * - * @return mixed - */ - public function shift() - { - return array_shift($this->items); - } - - /** - * 把一个数组分割为新的数组块. - * - * @param int $size - * @param bool $preserveKeys - * @return static - */ - public function chunk($size, $preserveKeys = false) - { - $chunks = []; - - foreach (array_chunk($this->items, $size, $preserveKeys) as $chunk) { - $chunks[] = new static($chunk); - } - - return new static($chunks); - } - - /** - * 在数组开头插入一个元素 - * @param mixed $value - * @param null $key - * @return int - */ - public function unshift($value, $key = null) - { - if (is_null($key)) { - array_unshift($this->items, $value); - } else { - $this->items = [$key => $value] + $this->items; - } - } - - /** - * 给每个元素执行个回调 - * - * @param callable $callback - * @return $this - */ - public function each(callable $callback) - { - foreach ($this->items as $key => $item) { - if ($callback($item, $key) === false) { - break; - } - } - - return $this; - } - - /** - * 用回调函数过滤数组中的元素 - * @param callable|null $callback - * @return static - */ - public function filter(callable $callback = null) - { - if ($callback) { - return new static(array_filter($this->items, $callback)); - } - - return new static(array_filter($this->items)); - } - - /** - * 返回数组中指定的一列 - * @param $column_key - * @param null $index_key - * @return array - */ - public function column($column_key, $index_key = null) - { - if (function_exists('array_column')) { - return array_column($this->items, $column_key, $index_key); - } - - $result = []; - foreach ($this->items as $row) { - $key = $value = null; - $keySet = $valueSet = false; - if (null !== $index_key && array_key_exists($index_key, $row)) { - $keySet = true; - $key = (string)$row[$index_key]; - } - if (null === $column_key) { - $valueSet = true; - $value = $row; - } elseif (is_array($row) && array_key_exists($column_key, $row)) { - $valueSet = true; - $value = $row[$column_key]; - } - if ($valueSet) { - if ($keySet) { - $result[$key] = $value; - } else { - $result[] = $value; - } - } - } - return $result; - } - - /** - * 对数组排序 - * - * @param callable|null $callback - * @return static - */ - public function sort(callable $callback = null) - { - $items = $this->items; - - $callback ? uasort($items, $callback) : uasort($items, function ($a, $b) { - - if ($a == $b) { - return 0; - } - - return ($a < $b) ? -1 : 1; - }); - - return new static($items); - } - - /** - * 将数组打乱 - * - * @return static - */ - public function shuffle() - { - $items = $this->items; - - shuffle($items); - - return new static($items); - } - - /** - * 截取数组 - * - * @param int $offset - * @param int $length - * @param bool $preserveKeys - * @return static - */ - public function slice($offset, $length = null, $preserveKeys = false) - { - return new static(array_slice($this->items, $offset, $length, $preserveKeys)); - } - - // ArrayAccess - public function offsetExists($offset) - { - return array_key_exists($offset, $this->items); - } - - public function offsetGet($offset) - { - return $this->items[$offset]; - } - - public function offsetSet($offset, $value) - { - if (is_null($offset)) { - $this->items[] = $value; - } else { - $this->items[$offset] = $value; - } - } - - public function offsetUnset($offset) - { - unset($this->items[$offset]); - } - - //Countable - public function count() - { - return count($this->items); - } - - //IteratorAggregate - public function getIterator() - { - return new ArrayIterator($this->items); - } - - //JsonSerializable - public function jsonSerialize() - { - return $this->toArray(); - } - - /** - * 转换当前数据集为JSON字符串 - * @access public - * @param integer $options json参数 - * @return string - */ - public function toJson($options = JSON_UNESCAPED_UNICODE) - { - return json_encode($this->toArray(), $options); - } - - public function __toString() - { - return $this->toJson(); - } - - /** - * 转换成数组 - * - * @param mixed $items - * @return array - */ - protected function convertToArray($items) - { - if ($items instanceof self) { - return $items->all(); - } - return (array)$items; - } -} diff --git a/thinkphp/library/think/Config.php b/thinkphp/library/think/Config.php deleted file mode 100755 index fb5340d..0000000 --- a/thinkphp/library/think/Config.php +++ /dev/null @@ -1,170 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -class Config -{ - // 配置参数 - private static $config = []; - // 参数作用域 - private static $range = '_sys_'; - - // 设定配置参数的作用域 - public static function range($range) - { - self::$range = $range; - if (!isset(self::$config[$range])) { - self::$config[$range] = []; - } - } - - /** - * 解析配置文件或内容 - * @param string $config 配置文件路径或内容 - * @param string $type 配置解析类型 - * @param string $name 配置名(如设置即表示二级配置) - * @param string $range 作用域 - * @return mixed - */ - public static function parse($config, $type = '', $name = '', $range = '') - { - $range = $range ?: self::$range; - if (empty($type)) { - $type = pathinfo($config, PATHINFO_EXTENSION); - } - $class = false !== strpos($type, '\\') ? $type : '\\think\\config\\driver\\' . ucwords($type); - return self::set((new $class())->parse($config), $name, $range); - } - - /** - * 加载配置文件(PHP格式) - * @param string $file 配置文件名 - * @param string $name 配置名(如设置即表示二级配置) - * @param string $range 作用域 - * @return mixed - */ - public static function load($file, $name = '', $range = '') - { - $range = $range ?: self::$range; - if (!isset(self::$config[$range])) { - self::$config[$range] = []; - } - if (is_file($file)) { - $name = strtolower($name); - $type = pathinfo($file, PATHINFO_EXTENSION); - if ('php' == $type) { - return self::set(include $file, $name, $range); - } elseif ('yaml' == $type && function_exists('yaml_parse_file')) { - return self::set(yaml_parse_file($file), $name, $range); - } else { - return self::parse($file, $type, $name, $range); - } - } else { - return self::$config[$range]; - } - } - - /** - * 检测配置是否存在 - * @param string $name 配置参数名(支持二级配置 .号分割) - * @param string $range 作用域 - * @return bool - */ - public static function has($name, $range = '') - { - $range = $range ?: self::$range; - - if (!strpos($name, '.')) { - return isset(self::$config[$range][strtolower($name)]); - } else { - // 二维数组设置和获取支持 - $name = explode('.', $name); - return isset(self::$config[$range][strtolower($name[0])][$name[1]]); - } - } - - /** - * 获取配置参数 为空则获取所有配置 - * @param string $name 配置参数名(支持二级配置 .号分割) - * @param string $range 作用域 - * @return mixed - */ - public static function get($name = null, $range = '') - { - $range = $range ?: self::$range; - // 无参数时获取所有 - if (empty($name) && isset(self::$config[$range])) { - return self::$config[$range]; - } - - if (!strpos($name, '.')) { - $name = strtolower($name); - return isset(self::$config[$range][$name]) ? self::$config[$range][$name] : null; - } else { - // 二维数组设置和获取支持 - $name = explode('.', $name); - $name[0] = strtolower($name[0]); - return isset(self::$config[$range][$name[0]][$name[1]]) ? self::$config[$range][$name[0]][$name[1]] : null; - } - } - - /** - * 设置配置参数 name为数组则为批量设置 - * @param string|array $name 配置参数名(支持二级配置 .号分割) - * @param mixed $value 配置值 - * @param string $range 作用域 - * @return mixed - */ - public static function set($name, $value = null, $range = '') - { - $range = $range ?: self::$range; - if (!isset(self::$config[$range])) { - self::$config[$range] = []; - } - if (is_string($name)) { - if (!strpos($name, '.')) { - self::$config[$range][strtolower($name)] = $value; - } else { - // 二维数组设置和获取支持 - $name = explode('.', $name); - self::$config[$range][strtolower($name[0])][$name[1]] = $value; - } - return; - } elseif (is_array($name)) { - // 批量设置 - if (!empty($value)) { - self::$config[$range][$value] = isset(self::$config[$range][$value]) ? - array_merge(self::$config[$range][$value], $name) : - self::$config[$range][$value] = $name; - return self::$config[$range][$value]; - } else { - return self::$config[$range] = array_merge(self::$config[$range], array_change_key_case($name)); - } - } else { - // 为空直接返回 已有配置 - return self::$config[$range]; - } - } - - /** - * 重置配置参数 - */ - public static function reset($range = '') - { - $range = $range ?: self::$range; - if (true === $range) { - self::$config = []; - } else { - self::$config[$range] = []; - } - } -} diff --git a/thinkphp/library/think/Console.php b/thinkphp/library/think/Console.php deleted file mode 100755 index ab8e021..0000000 --- a/thinkphp/library/think/Console.php +++ /dev/null @@ -1,718 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | TopThink [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2015 http://www.topthink.com All rights reserved. -// +---------------------------------------------------------------------- -// | Author: zhangyajun <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\console\Command; -use think\console\command\Help as HelpCommand; -use think\console\Input; -use think\console\input\Argument as InputArgument; -use think\console\input\Definition as InputDefinition; -use think\console\input\Option as InputOption; -use think\console\Output; -use think\console\output\driver\Buffer; - -class Console -{ - - private $name; - private $version; - - /** @var Command[] */ - private $commands = []; - - private $wantHelps = false; - - private $catchExceptions = true; - private $autoExit = true; - private $definition; - private $defaultCommand; - - private static $defaultCommands = [ - "think\\console\\command\\Help", - "think\\console\\command\\Lists", - "think\\console\\command\\Build", - "think\\console\\command\\Clear", - "think\\console\\command\\make\\Controller", - "think\\console\\command\\make\\Model", - "think\\console\\command\\optimize\\Autoload", - "think\\console\\command\\optimize\\Config", - "think\\console\\command\\optimize\\Route", - "think\\console\\command\\optimize\\Schema", - ]; - - public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN') - { - $this->name = $name; - $this->version = $version; - - $this->defaultCommand = 'list'; - $this->definition = $this->getDefaultInputDefinition(); - - foreach ($this->getDefaultCommands() as $command) { - $this->add($command); - } - } - - public static function init($run = true) - { - static $console; - if (!$console) { - // 实例化console - $console = new self('Think Console', '0.1'); - // 读取指令集 - if (is_file(CONF_PATH . 'command' . EXT)) { - $commands = include CONF_PATH . 'command' . EXT; - if (is_array($commands)) { - foreach ($commands as $command) { - if (class_exists($command) && is_subclass_of($command, "\\think\\console\\Command")) { - // 注册指令 - $console->add(new $command()); - } - } - } - } - } - if ($run) { - // 运行 - return $console->run(); - } else { - return $console; - } - } - - /** - * @param $command - * @param array $parameters - * @return Output|Buffer - */ - public static function call($command, array $parameters = []) - { - $console = self::init(false); - - array_unshift($parameters, $command); - - $input = new Input($parameters); - $output = new Output('buffer'); - - $console->setCatchExceptions(false); - $console->find($command)->run($input, $output); - - return $output; - } - - /** - * 执行当前的指令 - * @return int - * @throws \Exception - * @api - */ - public function run() - { - $input = new Input(); - $output = new Output(); - - $this->configureIO($input, $output); - - try { - $exitCode = $this->doRun($input, $output); - } catch (\Exception $e) { - if (!$this->catchExceptions) { - throw $e; - } - - $output->renderException($e); - - $exitCode = $e->getCode(); - if (is_numeric($exitCode)) { - $exitCode = (int) $exitCode; - if (0 === $exitCode) { - $exitCode = 1; - } - } else { - $exitCode = 1; - } - } - - if ($this->autoExit) { - if ($exitCode > 255) { - $exitCode = 255; - } - - exit($exitCode); - } - - return $exitCode; - } - - /** - * 执行指令 - * @param Input $input - * @param Output $output - * @return int - */ - public function doRun(Input $input, Output $output) - { - if (true === $input->hasParameterOption(['--version', '-V'])) { - $output->writeln($this->getLongVersion()); - - return 0; - } - - $name = $this->getCommandName($input); - - if (true === $input->hasParameterOption(['--help', '-h'])) { - if (!$name) { - $name = 'help'; - $input = new Input(['help']); - } else { - $this->wantHelps = true; - } - } - - if (!$name) { - $name = $this->defaultCommand; - $input = new Input([$this->defaultCommand]); - } - - $command = $this->find($name); - - $exitCode = $this->doRunCommand($command, $input, $output); - - return $exitCode; - } - - /** - * 设置输入参数定义 - * @param InputDefinition $definition - */ - public function setDefinition(InputDefinition $definition) - { - $this->definition = $definition; - } - - /** - * 获取输入参数定义 - * @return InputDefinition The InputDefinition instance - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * Gets the help message. - * @return string A help message. - */ - public function getHelp() - { - return $this->getLongVersion(); - } - - /** - * 是否捕获异常 - * @param bool $boolean - * @api - */ - public function setCatchExceptions($boolean) - { - $this->catchExceptions = (bool) $boolean; - } - - /** - * 是否自动退出 - * @param bool $boolean - * @api - */ - public function setAutoExit($boolean) - { - $this->autoExit = (bool) $boolean; - } - - /** - * 获取名称 - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * 设置名称 - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * 获取版本 - * @return string - * @api - */ - public function getVersion() - { - return $this->version; - } - - /** - * 设置版本 - * @param string $version - */ - public function setVersion($version) - { - $this->version = $version; - } - - /** - * 获取完整的版本号 - * @return string - */ - public function getLongVersion() - { - if ('UNKNOWN' !== $this->getName() && 'UNKNOWN' !== $this->getVersion()) { - return sprintf('<info>%s</info> version <comment>%s</comment>', $this->getName(), $this->getVersion()); - } - - return '<info>Console Tool</info>'; - } - - /** - * 注册一个指令 - * @param string $name - * @return Command - */ - public function register($name) - { - return $this->add(new Command($name)); - } - - /** - * 添加指令 - * @param Command[] $commands - */ - public function addCommands(array $commands) - { - foreach ($commands as $command) { - $this->add($command); - } - } - - /** - * 添加一个指令 - * @param Command $command - * @return Command - */ - public function add(Command $command) - { - $command->setConsole($this); - - if (!$command->isEnabled()) { - $command->setConsole(null); - return null; - } - - if (null === $command->getDefinition()) { - throw new \LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', get_class($command))); - } - - $this->commands[$command->getName()] = $command; - - foreach ($command->getAliases() as $alias) { - $this->commands[$alias] = $command; - } - - return $command; - } - - /** - * 获取指令 - * @param string $name 指令名称 - * @return Command - * @throws \InvalidArgumentException - */ - public function get($name) - { - if (!isset($this->commands[$name])) { - throw new \InvalidArgumentException(sprintf('The command "%s" does not exist.', $name)); - } - - $command = $this->commands[$name]; - - if ($this->wantHelps) { - $this->wantHelps = false; - - /** @var HelpCommand $helpCommand */ - $helpCommand = $this->get('help'); - $helpCommand->setCommand($command); - - return $helpCommand; - } - - return $command; - } - - /** - * 某个指令是否存在 - * @param string $name 指令名称 - * @return bool - */ - public function has($name) - { - return isset($this->commands[$name]); - } - - /** - * 获取所有的命名空间 - * @return array - */ - public function getNamespaces() - { - $namespaces = []; - foreach ($this->commands as $command) { - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName())); - - foreach ($command->getAliases() as $alias) { - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias)); - } - } - - return array_values(array_unique(array_filter($namespaces))); - } - - /** - * 查找注册命名空间中的名称或缩写。 - * @param string $namespace - * @return string - * @throws \InvalidArgumentException - */ - public function findNamespace($namespace) - { - $allNamespaces = $this->getNamespaces(); - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { - return preg_quote($matches[1]) . '[^:]*'; - }, $namespace); - $namespaces = preg_grep('{^' . $expr . '}', $allNamespaces); - - if (empty($namespaces)) { - $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); - - if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) { - if (1 == count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - $exact = in_array($namespace, $namespaces, true); - if (count($namespaces) > 1 && !$exact) { - throw new \InvalidArgumentException(sprintf('The namespace "%s" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions(array_values($namespaces)))); - } - - return $exact ? $namespace : reset($namespaces); - } - - /** - * 查找指令 - * @param string $name 名称或者别名 - * @return Command - * @throws \InvalidArgumentException - */ - public function find($name) - { - $allCommands = array_keys($this->commands); - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { - return preg_quote($matches[1]) . '[^:]*'; - }, $name); - $commands = preg_grep('{^' . $expr . '}', $allCommands); - - if (empty($commands) || count(preg_grep('{^' . $expr . '$}', $commands)) < 1) { - if (false !== $pos = strrpos($name, ':')) { - $this->findNamespace(substr($name, 0, $pos)); - } - - $message = sprintf('Command "%s" is not defined.', $name); - - if ($alternatives = $this->findAlternatives($name, $allCommands)) { - if (1 == count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - if (count($commands) > 1) { - $commandList = $this->commands; - $commands = array_filter($commands, function ($nameOrAlias) use ($commandList, $commands) { - $commandName = $commandList[$nameOrAlias]->getName(); - - return $commandName === $nameOrAlias || !in_array($commandName, $commands); - }); - } - - $exact = in_array($name, $commands, true); - if (count($commands) > 1 && !$exact) { - $suggestions = $this->getAbbreviationSuggestions(array_values($commands)); - - throw new \InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $suggestions)); - } - - return $this->get($exact ? $name : reset($commands)); - } - - /** - * 获取所有的指令 - * @param string $namespace 命名空间 - * @return Command[] - * @api - */ - public function all($namespace = null) - { - if (null === $namespace) { - return $this->commands; - } - - $commands = []; - foreach ($this->commands as $name => $command) { - if ($this->extractNamespace($name, substr_count($namespace, ':') + 1) === $namespace) { - $commands[$name] = $command; - } - } - - return $commands; - } - - /** - * 获取可能的指令名 - * @param array $names - * @return array - */ - public static function getAbbreviations($names) - { - $abbrevs = []; - foreach ($names as $name) { - for ($len = strlen($name); $len > 0; --$len) { - $abbrev = substr($name, 0, $len); - $abbrevs[$abbrev][] = $name; - } - } - - return $abbrevs; - } - - /** - * 配置基于用户的参数和选项的输入和输出实例。 - * @param Input $input 输入实例 - * @param Output $output 输出实例 - */ - protected function configureIO(Input $input, Output $output) - { - if (true === $input->hasParameterOption(['--ansi'])) { - $output->setDecorated(true); - } elseif (true === $input->hasParameterOption(['--no-ansi'])) { - $output->setDecorated(false); - } - - if (true === $input->hasParameterOption(['--no-interaction', '-n'])) { - $input->setInteractive(false); - } - - if (true === $input->hasParameterOption(['--quiet', '-q'])) { - $output->setVerbosity(Output::VERBOSITY_QUIET); - } else { - if ($input->hasParameterOption('-vvv') || $input->hasParameterOption('--verbose=3') || $input->getParameterOption('--verbose') === 3) { - $output->setVerbosity(Output::VERBOSITY_DEBUG); - } elseif ($input->hasParameterOption('-vv') || $input->hasParameterOption('--verbose=2') || $input->getParameterOption('--verbose') === 2) { - $output->setVerbosity(Output::VERBOSITY_VERY_VERBOSE); - } elseif ($input->hasParameterOption('-v') || $input->hasParameterOption('--verbose=1') || $input->hasParameterOption('--verbose') || $input->getParameterOption('--verbose')) { - $output->setVerbosity(Output::VERBOSITY_VERBOSE); - } - } - } - - /** - * 执行指令 - * @param Command $command 指令实例 - * @param Input $input 输入实例 - * @param Output $output 输出实例 - * @return int - * @throws \Exception - */ - protected function doRunCommand(Command $command, Input $input, Output $output) - { - return $command->run($input, $output); - } - - /** - * 获取指令的基础名称 - * @param Input $input - * @return string - */ - protected function getCommandName(Input $input) - { - return $input->getFirstArgument(); - } - - /** - * 获取默认输入定义 - * @return InputDefinition - */ - protected function getDefaultInputDefinition() - { - return new InputDefinition([ - new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), - new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message'), - new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this console version'), - new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'), - new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), - new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output'), - new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output'), - new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'), - ]); - } - - /** - * 设置默认命令 - * @return Command[] An array of default Command instances - */ - protected function getDefaultCommands() - { - $defaultCommands = []; - - foreach (self::$defaultCommands as $classname) { - if (class_exists($classname) && is_subclass_of($classname, "think\\console\\Command")) { - $defaultCommands[] = new $classname(); - } - } - - return $defaultCommands; - } - - public static function addDefaultCommands(array $classnames) - { - self::$defaultCommands = array_merge(self::$defaultCommands, $classnames); - } - - /** - * 获取可能的建议 - * @param array $abbrevs - * @return string - */ - private function getAbbreviationSuggestions($abbrevs) - { - return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : ''); - } - - /** - * 返回命名空间部分 - * @param string $name 指令 - * @param string $limit 部分的命名空间的最大数量 - * @return string - */ - public function extractNamespace($name, $limit = null) - { - $parts = explode(':', $name); - array_pop($parts); - - return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit)); - } - - /** - * 查找可替代的建议 - * @param string $name - * @param array|\Traversable $collection - * @return array - */ - private function findAlternatives($name, $collection) - { - $threshold = 1e3; - $alternatives = []; - - $collectionParts = []; - foreach ($collection as $item) { - $collectionParts[$item] = explode(':', $item); - } - - foreach (explode(':', $name) as $i => $subname) { - foreach ($collectionParts as $collectionName => $parts) { - $exists = isset($alternatives[$collectionName]); - if (!isset($parts[$i]) && $exists) { - $alternatives[$collectionName] += $threshold; - continue; - } elseif (!isset($parts[$i])) { - continue; - } - - $lev = levenshtein($subname, $parts[$i]); - if ($lev <= strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) { - $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; - } elseif ($exists) { - $alternatives[$collectionName] += $threshold; - } - } - } - - foreach ($collection as $item) { - $lev = levenshtein($name, $item); - if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) { - $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; - } - } - - $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { - return $lev < 2 * $threshold; - }); - asort($alternatives); - - return array_keys($alternatives); - } - - /** - * 设置默认的指令 - * @param string $commandName The Command name - */ - public function setDefaultCommand($commandName) - { - $this->defaultCommand = $commandName; - } - - /** - * 返回所有的命名空间 - * @param string $name - * @return array - */ - private function extractAllNamespaces($name) - { - $parts = explode(':', $name, -1); - $namespaces = []; - - foreach ($parts as $part) { - if (count($namespaces)) { - $namespaces[] = end($namespaces) . ':' . $part; - } else { - $namespaces[] = $part; - } - } - - return $namespaces; - } - -} diff --git a/thinkphp/library/think/Controller.php b/thinkphp/library/think/Controller.php deleted file mode 100755 index a889e4d..0000000 --- a/thinkphp/library/think/Controller.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -\think\Loader::import('controller/Jump', TRAIT_PATH, EXT); - -use think\Exception; -use think\exception\ValidateException; - -class Controller -{ - use \traits\controller\Jump; - - // 视图类实例 - protected $view; - // Request实例 - protected $request; - // 验证失败是否抛出异常 - protected $failException = false; - // 是否批量验证 - protected $batchValidate = false; - - /** - * 前置操作方法列表 - * @var array $beforeActionList - * @access protected - */ - protected $beforeActionList = []; - - /** - * 架构函数 - * @param Request $request Request对象 - * @access public - */ - public function __construct(Request $request = null) - { - if (is_null($request)) { - $request = Request::instance(); - } - $this->view = View::instance(Config::get('template'), Config::get('view_replace_str')); - $this->request = $request; - - // 控制器初始化 - $this->_initialize(); - - // 前置操作方法 - if ($this->beforeActionList) { - foreach ($this->beforeActionList as $method => $options) { - is_numeric($method) ? - $this->beforeAction($options) : - $this->beforeAction($method, $options); - } - } - } - - // 初始化 - protected function _initialize() - { - } - - /** - * 前置操作 - * @access protected - * @param string $method 前置操作方法名 - * @param array $options 调用参数 ['only'=>[...]] 或者['except'=>[...]] - */ - protected function beforeAction($method, $options = []) - { - if (isset($options['only'])) { - if (is_string($options['only'])) { - $options['only'] = explode(',', $options['only']); - } - if (!in_array($this->request->action(), $options['only'])) { - return; - } - } elseif (isset($options['except'])) { - if (is_string($options['except'])) { - $options['except'] = explode(',', $options['except']); - } - if (in_array($this->request->action(), $options['except'])) { - return; - } - } - - call_user_func([$this, $method]); - } - - /** - * 加载模板输出 - * @access protected - * @param string $template 模板文件名 - * @param array $vars 模板输出变量 - * @param array $replace 模板替换 - * @param array $config 模板参数 - * @return mixed - */ - protected function fetch($template = '', $vars = [], $replace = [], $config = []) - { - return $this->view->fetch($template, $vars, $replace, $config); - } - - /** - * 渲染内容输出 - * @access protected - * @param string $content 模板内容 - * @param array $vars 模板输出变量 - * @param array $replace 替换内容 - * @param array $config 模板参数 - * @return mixed - */ - protected function display($content = '', $vars = [], $replace = [], $config = []) - { - return $this->view->display($content, $vars, $replace, $config); - } - - /** - * 模板变量赋值 - * @access protected - * @param mixed $name 要显示的模板变量 - * @param mixed $value 变量的值 - * @return void - */ - protected function assign($name, $value = '') - { - $this->view->assign($name, $value); - } - - /** - * 初始化模板引擎 - * @access protected - * @param array|string $engine 引擎参数 - * @return void - */ - protected function engine($engine) - { - $this->view->engine($engine); - } - - /** - * 设置验证失败后是否抛出异常 - * @access protected - * @param bool $fail 是否抛出异常 - * @return $this - */ - protected function validateFailException($fail = true) - { - $this->failException = $fail; - return $this; - } - - /** - * 验证数据 - * @access protected - * @param array $data 数据 - * @param string|array $validate 验证器名或者验证规则数组 - * @param array $message 提示信息 - * @param bool $batch 是否批量验证 - * @param mixed $callback 回调方法(闭包) - * @return array|string|true - * @throws ValidateException - */ - protected function validate($data, $validate, $message = [], $batch = false, $callback = null) - { - if (is_array($validate)) { - $v = Loader::validate(); - $v->rule($validate); - } else { - if (strpos($validate, '.')) { - // 支持场景 - list($validate, $scene) = explode('.', $validate); - } - $v = Loader::validate($validate); - if (!empty($scene)) { - $v->scene($scene); - } - } - // 是否批量验证 - if ($batch || $this->batchValidate) { - $v->batch(true); - } - - if (is_array($message)) { - $v->message($message); - } - - if ($callback && is_callable($callback)) { - call_user_func_array($callback, [$v, &$data]); - } - - if (!$v->check($data)) { - if ($this->failException) { - throw new ValidateException($v->getError()); - } else { - return $v->getError(); - } - } else { - return true; - } - } -} diff --git a/thinkphp/library/think/Cookie.php b/thinkphp/library/think/Cookie.php deleted file mode 100755 index 648b2c6..0000000 --- a/thinkphp/library/think/Cookie.php +++ /dev/null @@ -1,195 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -class Cookie -{ - protected static $config = [ - // cookie 名称前缀 - 'prefix' => '', - // cookie 保存时间 - 'expire' => 0, - // cookie 保存路径 - 'path' => '/', - // cookie 有效域名 - 'domain' => '', - // cookie 启用安全传输 - 'secure' => false, - // httponly设置 - 'httponly' => '', - // 是否使用 setcookie - 'setcookie' => true, - ]; - - protected static $init; - - /** - * Cookie初始化 - * @param array $config - * @return void - */ - public static function init(array $config = []) - { - if (empty($config)) { - $config = Config::get('cookie'); - } - self::$config = array_merge(self::$config, array_change_key_case($config)); - if (!empty(self::$config['httponly'])) { - ini_set('session.cookie_httponly', 1); - } - self::$init = true; - } - - /** - * 设置或者获取cookie作用域(前缀) - * @param string $prefix - * @return string|void - */ - public static function prefix($prefix = '') - { - if (empty($prefix)) { - return self::$config['prefix']; - } - self::$config['prefix'] = $prefix; - } - - /** - * Cookie 设置、获取、删除 - * - * @param string $name cookie名称 - * @param mixed $value cookie值 - * @param mixed $option 可选参数 可能会是 null|integer|string - * - * @return mixed - * @internal param mixed $options cookie参数 - */ - public static function set($name, $value = '', $option = null) - { - !isset(self::$init) && self::init(); - // 参数设置(会覆盖黙认设置) - if (!is_null($option)) { - if (is_numeric($option)) { - $option = ['expire' => $option]; - } elseif (is_string($option)) { - parse_str($option, $option); - } - $config = array_merge(self::$config, array_change_key_case($option)); - } else { - $config = self::$config; - } - $name = $config['prefix'] . $name; - // 设置cookie - if (is_array($value)) { - array_walk_recursive($value, 'self::jsonFormatProtect', 'encode'); - $value = 'think:' . json_encode($value); - } - $expire = !empty($config['expire']) ? $_SERVER['REQUEST_TIME'] + intval($config['expire']) : 0; - if ($config['setcookie']) { - setcookie($name, $value, $expire, $config['path'], $config['domain'], $config['secure'], $config['httponly']); - } - $_COOKIE[$name] = $value; - } - - /** - * 判断Cookie数据 - * @param string $name cookie名称 - * @param string|null $prefix cookie前缀 - * @return bool - */ - public static function has($name, $prefix = null) - { - !isset(self::$init) && self::init(); - $prefix = !is_null($prefix) ? $prefix : self::$config['prefix']; - $name = $prefix . $name; - return isset($_COOKIE[$name]); - } - - /** - * Cookie获取 - * @param string $name cookie名称 - * @param string|null $prefix cookie前缀 - * @return mixed - */ - public static function get($name, $prefix = null) - { - !isset(self::$init) && self::init(); - $prefix = !is_null($prefix) ? $prefix : self::$config['prefix']; - $name = $prefix . $name; - if (isset($_COOKIE[$name])) { - $value = $_COOKIE[$name]; - if (0 === strpos($value, 'think:')) { - $value = substr($value, 6); - $value = json_decode($value, true); - array_walk_recursive($value, 'self::jsonFormatProtect', 'decode'); - } - return $value; - } else { - return null; - } - } - - /** - * Cookie删除 - * @param string $name cookie名称 - * @param string|null $prefix cookie前缀 - * @return mixed - */ - public static function delete($name, $prefix = null) - { - !isset(self::$init) && self::init(); - $config = self::$config; - $prefix = !is_null($prefix) ? $prefix : $config['prefix']; - $name = $prefix . $name; - if ($config['setcookie']) { - setcookie($name, '', $_SERVER['REQUEST_TIME'] - 3600, $config['path'], $config['domain'], $config['secure'], $config['httponly']); - } - // 删除指定cookie - unset($_COOKIE[$name]); - } - - /** - * Cookie清空 - * @param string|null $prefix cookie前缀 - * @return mixed - */ - public static function clear($prefix = null) - { - // 清除指定前缀的所有cookie - if (empty($_COOKIE)) { - return; - } - !isset(self::$init) && self::init(); - // 要删除的cookie前缀,不指定则删除config设置的指定前缀 - $config = self::$config; - $prefix = !is_null($prefix) ? $prefix : $config['prefix']; - if ($prefix) { - // 如果前缀为空字符串将不作处理直接返回 - foreach ($_COOKIE as $key => $val) { - if (0 === strpos($key, $prefix)) { - if ($config['setcookie']) { - setcookie($key, '', $_SERVER['REQUEST_TIME'] - 3600, $config['path'], $config['domain'], $config['secure'], $config['httponly']); - } - unset($_COOKIE[$key]); - } - } - } - return; - } - - private static function jsonFormatProtect(&$val, $key, $type = 'encode') - { - if (!empty($val) && true !== $val) { - $val = 'decode' == $type ? urldecode($val) : urlencode($val); - } - } - -} diff --git a/thinkphp/library/think/Db.php b/thinkphp/library/think/Db.php deleted file mode 100755 index c67cba6..0000000 --- a/thinkphp/library/think/Db.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\App; -use think\Collection; -use think\db\Query; -use think\paginator\Collection as PaginatorCollection; - -/** - * Class Db - * @package think - * @method Query table(string $table) static 指定数据表(含前缀) - * @method Query name(string $name) static 指定数据表(不含前缀) - * @method Query where(mixed $field, string $op = null, mixed $condition = null) static 查询条件 - * @method Query join(mixed $join, mixed $condition = null, string $type = 'INNER') static JOIN查询 - * @method Query union(mixed $union, boolean $all = false) static UNION查询 - * @method Query limit(mixed $offset, integer $length = null) static 查询LIMIT - * @method Query order(mixed $field, string $order = null) static 查询ORDER - * @method Query cache(mixed $key = true , integer $expire = null) static 设置查询缓存 - * @method mixed value(string $field) static 获取某个字段的值 - * @method array column(string $field, string $key = '') static 获取某个列的值 - * @method Query view(mixed $join, mixed $field = null, mixed $on = null, string $type = 'INNER') static 视图查询 - * @method mixed find(mixed $data = []) static 查询单个记录 - * @method mixed select(mixed $data = []) static 查询多个记录 - * @method integer insert(array $data, boolean $replace = false, boolean $getLastInsID = false, string $sequence = null) static 插入一条记录 - * @method integer insertGetId(array $data, boolean $replace = false, string $sequence = null) static 插入一条记录并返回自增ID - * @method integer insertAll(array $dataSet) static 插入多条记录 - * @method integer update(array $data) static 更新记录 - * @method integer delete(mixed $data = []) static 删除记录 - * @method boolean chunk(integer $count, callable $callback, string $column = null) static 分块获取数据 - * @method mixed query(string $sql, array $bind = [], boolean $fetch = false, boolean $master = false, mixed $class = false) static SQL查询 - * @method integer execute(string $sql, array $bind = [], boolean $fetch = false, boolean $getLastInsID = false, string $sequence = null) static SQL执行 - * @method PaginatorCollection paginate(integer $listRows = 15, mixed $simple = false, array $config = []) static 分页查询 - * @method mixed transaction(callable $callback) static 执行数据库事务 - * @method void startTrans() static 启动事务 - * @method void commit() static 用于非自动提交状态下面的查询提交 - * @method void rollback() static 事务回滚 - * @method boolean batchQuery(array $sqlArray) static 批处理执行SQL语句 - */ -class Db -{ - // 数据库连接实例 - private static $instance = []; - // 查询次数 - public static $queryTimes = 0; - // 执行次数 - public static $executeTimes = 0; - - /** - * 数据库初始化 并取得数据库类实例 - * @static - * @access public - * @param mixed $config 连接配置 - * @param bool|string $name 连接标识 true 强制重新连接 - * @return \think\db\Connection - * @throws Exception - */ - public static function connect($config = [], $name = false) - { - if (false === $name) { - $name = md5(serialize($config)); - } - if (true === $name || !isset(self::$instance[$name])) { - // 解析连接参数 支持数组和字符串 - $options = self::parseConfig($config); - if (empty($options['type'])) { - throw new \InvalidArgumentException('Underfined db type'); - } - $class = false !== strpos($options['type'], '\\') ? $options['type'] : '\\think\\db\\connector\\' . ucwords($options['type']); - // 记录初始化信息 - if (App::$debug) { - Log::record('[ DB ] INIT ' . $options['type'], 'info'); - } - if (true === $name) { - return new $class($options); - } else { - self::$instance[$name] = new $class($options); - } - } - return self::$instance[$name]; - } - - /** - * 数据库连接参数解析 - * @static - * @access private - * @param mixed $config - * @return array - */ - private static function parseConfig($config) - { - if (empty($config)) { - $config = Config::get('database'); - } elseif (is_string($config) && false === strpos($config, '/')) { - // 支持读取配置参数 - $config = Config::get($config); - } - if (is_string($config)) { - return self::parseDsn($config); - } else { - return $config; - } - } - - /** - * DSN解析 - * 格式: mysql://username:passwd@localhost:3306/DbName?param1=val1¶m2=val2#utf8 - * @static - * @access private - * @param string $dsnStr - * @return array - */ - private static function parseDsn($dsnStr) - { - $info = parse_url($dsnStr); - if (!$info) { - return []; - } - $dsn = [ - 'type' => $info['scheme'], - 'username' => isset($info['user']) ? $info['user'] : '', - 'password' => isset($info['pass']) ? $info['pass'] : '', - 'hostname' => isset($info['host']) ? $info['host'] : '', - 'hostport' => isset($info['port']) ? $info['port'] : '', - 'database' => !empty($info['path']) ? ltrim($info['path'], '/') : '', - 'charset' => isset($info['fragment']) ? $info['fragment'] : 'utf8', - ]; - - if (isset($info['query'])) { - parse_str($info['query'], $dsn['params']); - } else { - $dsn['params'] = []; - } - return $dsn; - } - - // 调用驱动类的方法 - public static function __callStatic($method, $params) - { - // 自动初始化数据库 - return call_user_func_array([self::connect(), $method], $params); - } -} diff --git a/thinkphp/library/think/Debug.php b/thinkphp/library/think/Debug.php deleted file mode 100755 index e36a764..0000000 --- a/thinkphp/library/think/Debug.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\Config; -use think\exception\ClassNotFoundException; -use think\Log; -use think\Request; -use think\Response; -use think\response\Redirect; - -class Debug -{ - // 区间时间信息 - protected static $info = []; - // 区间内存信息 - protected static $mem = []; - - /** - * 记录时间(微秒)和内存使用情况 - * @param string $name 标记位置 - * @param mixed $value 标记值 留空则取当前 time 表示仅记录时间 否则同时记录时间和内存 - * @return mixed - */ - public static function remark($name, $value = '') - { - // 记录时间和内存使用 - self::$info[$name] = is_float($value) ? $value : microtime(true); - if ('time' != $value) { - self::$mem['mem'][$name] = is_float($value) ? $value : memory_get_usage(); - self::$mem['peak'][$name] = memory_get_peak_usage(); - } - } - - /** - * 统计某个区间的时间(微秒)使用情况 - * @param string $start 开始标签 - * @param string $end 结束标签 - * @param integer|string $dec 小数位 - * @return integer - */ - public static function getRangeTime($start, $end, $dec = 6) - { - if (!isset(self::$info[$end])) { - self::$info[$end] = microtime(true); - } - return number_format((self::$info[$end] - self::$info[$start]), $dec); - } - - /** - * 统计从开始到统计时的时间(微秒)使用情况 - * @param integer|string $dec 小数位 - * @return integer - */ - public static function getUseTime($dec = 6) - { - return number_format((microtime(true) - THINK_START_TIME), $dec); - } - - /** - * 获取当前访问的吞吐率情况 - * @return string - */ - public static function getThroughputRate() - { - return number_format(1 / self::getUseTime(), 2) . 'req/s'; - } - - /** - * 记录区间的内存使用情况 - * @param string $start 开始标签 - * @param string $end 结束标签 - * @param integer|string $dec 小数位 - * @return string - */ - public static function getRangeMem($start, $end, $dec = 2) - { - if (!isset(self::$mem['mem'][$end])) { - self::$mem['mem'][$end] = memory_get_usage(); - } - $size = self::$mem['mem'][$end] - self::$mem['mem'][$start]; - $a = ['B', 'KB', 'MB', 'GB', 'TB']; - $pos = 0; - while ($size >= 1024) { - $size /= 1024; - $pos++; - } - return round($size, $dec) . " " . $a[$pos]; - } - - /** - * 统计从开始到统计时的内存使用情况 - * @param integer|string $dec 小数位 - * @return string - */ - public static function getUseMem($dec = 2) - { - $size = memory_get_usage() - THINK_START_MEM; - $a = ['B', 'KB', 'MB', 'GB', 'TB']; - $pos = 0; - while ($size >= 1024) { - $size /= 1024; - $pos++; - } - return round($size, $dec) . " " . $a[$pos]; - } - - /** - * 统计区间的内存峰值情况 - * @param string $start 开始标签 - * @param string $end 结束标签 - * @param integer|string $dec 小数位 - * @return mixed - */ - public static function getMemPeak($start, $end, $dec = 2) - { - if (!isset(self::$mem['peak'][$end])) { - self::$mem['peak'][$end] = memory_get_peak_usage(); - } - $size = self::$mem['peak'][$end] - self::$mem['peak'][$start]; - $a = ['B', 'KB', 'MB', 'GB', 'TB']; - $pos = 0; - while ($size >= 1024) { - $size /= 1024; - $pos++; - } - return round($size, $dec) . " " . $a[$pos]; - } - - /** - * 获取文件加载信息 - * @param bool $detail 是否显示详细 - * @return integer|array - */ - public static function getFile($detail = false) - { - if ($detail) { - $files = get_included_files(); - $info = []; - foreach ($files as $key => $file) { - $info[] = $file . ' ( ' . number_format(filesize($file) / 1024, 2) . ' KB )'; - } - return $info; - } - return count(get_included_files()); - } - - /** - * 浏览器友好的变量输出 - * @param mixed $var 变量 - * @param boolean $echo 是否输出 默认为true 如果为false 则返回输出字符串 - * @param string $label 标签 默认为空 - * @param integer $flags htmlspecialchars flags - * @return void|string - */ - public static function dump($var, $echo = true, $label = null, $flags = ENT_SUBSTITUTE) - { - $label = (null === $label) ? '' : rtrim($label) . ':'; - ob_start(); - var_dump($var); - $output = ob_get_clean(); - $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); - if (IS_CLI) { - $output = PHP_EOL . $label . $output . PHP_EOL; - } else { - if (!extension_loaded('xdebug')) { - $output = htmlspecialchars($output, $flags); - } - $output = '<pre>' . $label . $output . '</pre>'; - } - if ($echo) { - echo ($output); - return null; - } else { - return $output; - } - } - - public static function inject(Response $response, &$content) - { - $config = Config::get('trace'); - $type = isset($config['type']) ? $config['type'] : 'Html'; - $request = Request::instance(); - $class = false !== strpos($type, '\\') ? $type : '\\think\\debug\\' . ucwords($type); - unset($config['type']); - if (class_exists($class)) { - $trace = new $class($config); - } else { - throw new ClassNotFoundException('class not exists:' . $class, $class); - } - - if ($response instanceof Redirect) { - //TODO 记录 - } else { - $output = $trace->output($response, Log::getLog()); - if (is_string($output)) { - // trace调试信息注入 - $pos = strripos($content, '</body>'); - if (false !== $pos) { - $content = substr($content, 0, $pos) . $output . substr($content, $pos); - } else { - $content = $content . $output; - } - } - } - } -} diff --git a/thinkphp/library/think/Env.php b/thinkphp/library/think/Env.php deleted file mode 100755 index a23d992..0000000 --- a/thinkphp/library/think/Env.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -class Env -{ - /** - * 获取环境变量值 - * @param string $name 环境变量名(支持二级 .号分割) - * @param string $default 默认值 - * @return mixed - */ - public static function get($name, $default = null) - { - $result = getenv(ENV_PREFIX . strtoupper(str_replace('.', '_', $name))); - if (false !== $result) { - return $result; - } else { - return $default; - } - } -} diff --git a/thinkphp/library/think/Error.php b/thinkphp/library/think/Error.php deleted file mode 100755 index 28f7588..0000000 --- a/thinkphp/library/think/Error.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think; - -use think\console\Output as ConsoleOutput; -use think\exception\ErrorException; -use think\exception\Handle; -use think\exception\ThrowableError; - -class Error -{ - /** - * 注册异常处理 - * @return void - */ - public static function register() - { - error_reporting(E_ALL); - set_error_handler([__CLASS__, 'appError']); - set_exception_handler([__CLASS__, 'appException']); - register_shutdown_function([__CLASS__, 'appShutdown']); - } - - /** - * Exception Handler - * @param \Exception|\Throwable $e - */ - public static function appException($e) - { - if (!$e instanceof \Exception) { - $e = new ThrowableError($e); - } - - self::getExceptionHandler()->report($e); - if (IS_CLI) { - self::getExceptionHandler()->renderForConsole(new ConsoleOutput, $e); - } else { - self::getExceptionHandler()->render($e)->send(); - } - } - - /** - * Error Handler - * @param integer $errno 错误编号 - * @param integer $errstr 详细错误信息 - * @param string $errfile 出错的文件 - * @param integer $errline 出错行号 - * @param array $errcontext - * @throws ErrorException - */ - public static function appError($errno, $errstr, $errfile = '', $errline = 0, $errcontext = []) - { - $exception = new ErrorException($errno, $errstr, $errfile, $errline, $errcontext); - if (error_reporting() & $errno) { - // 将错误信息托管至 think\exception\ErrorException - throw $exception; - } else { - self::getExceptionHandler()->report($exception); - } - } - - /** - * Shutdown Handler - */ - public static function appShutdown() - { - if (!is_null($error = error_get_last()) && self::isFatal($error['type'])) { - // 将错误信息托管至think\ErrorException - $exception = new ErrorException($error['type'], $error['message'], $error['file'], $error['line']); - - self::appException($exception); - } - - // 写入日志 - Log::save(); - } - - /** - * 确定错误类型是否致命 - * - * @param int $type - * @return bool - */ - protected static function isFatal($type) - { - return in_array($type, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE]); - } - - /** - * Get an instance of the exception handler. - * - * @return Handle - */ - public static function getExceptionHandler() - { - static $handle; - if (!$handle) { - // 异常处理handle - $class = Config::get('exception_handle'); - if ($class && class_exists($class) && is_subclass_of($class, "\\think\\exception\\Handle")) { - $handle = new $class; - } else { - $handle = new Handle; - } - } - return $handle; - } -} diff --git a/thinkphp/library/think/Exception.php b/thinkphp/library/think/Exception.php deleted file mode 100755 index ac64876..0000000 --- a/thinkphp/library/think/Exception.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think; - -class Exception extends \Exception -{ - - /** - * 保存异常页面显示的额外Debug数据 - * @var array - */ - protected $data = []; - - /** - * 设置异常额外的Debug数据 - * 数据将会显示为下面的格式 - * - * Exception Data - * -------------------------------------------------- - * Label 1 - * key1 value1 - * key2 value2 - * Label 2 - * key1 value1 - * key2 value2 - * - * @param string $label 数据分类,用于异常页面显示 - * @param array $data 需要显示的数据,必须为关联数组 - */ - final protected function setData($label, array $data) - { - $this->data[$label] = $data; - } - - /** - * 获取异常额外Debug数据 - * 主要用于输出到异常页面便于调试 - * @return array 由setData设置的Debug数据 - */ - final public function getData() - { - return $this->data; - } - -} diff --git a/thinkphp/library/think/File.php b/thinkphp/library/think/File.php deleted file mode 100755 index 60a1641..0000000 --- a/thinkphp/library/think/File.php +++ /dev/null @@ -1,411 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use SplFileInfo; -use SplFileObject; - -class File extends SplFileObject -{ - /** - * 错误信息 - * @var string - */ - private $error = ''; - // 当前完整文件名 - protected $filename; - // 上传文件名 - protected $saveName; - // 文件上传命名规则 - protected $rule = 'date'; - // 文件上传验证规则 - protected $validate = []; - // 单元测试 - protected $isTest; - // 上传文件信息 - protected $info; - // 文件hash信息 - protected $hash = []; - - public function __construct($filename, $mode = 'r') - { - parent::__construct($filename, $mode); - $this->filename = $this->getRealPath() ?: $this->getPathname(); - } - - /** - * 是否测试 - * @param bool $test 是否测试 - * @return $this - */ - public function isTest($test = false) - { - $this->isTest = $test; - return $this; - } - - /** - * 设置上传信息 - * @param array $info 上传文件信息 - * @return $this - */ - public function setUploadInfo($info) - { - $this->info = $info; - return $this; - } - - /** - * 获取上传文件的信息 - * @param string $name - * @return array|string - */ - public function getInfo($name = '') - { - return isset($this->info[$name]) ? $this->info[$name] : $this->info; - } - - /** - * 获取上传文件的文件名 - * @return string - */ - public function getSaveName() - { - return $this->saveName; - } - - /** - * 设置上传文件的保存文件名 - * @param string $saveName - * @return $this - */ - public function setSaveName($saveName) - { - $this->saveName = $saveName; - return $this; - } - - /** - * 获取文件的哈希散列值 - * @return $string - */ - public function hash($type = 'sha1') - { - if (!isset($this->hash[$type])) { - $this->hash[$type] = hash_file($type, $this->filename); - } - return $this->hash[$type]; - } - - /** - * 检查目录是否可写 - * @param string $path 目录 - * @return boolean - */ - protected function checkPath($path) - { - if (is_dir($path)) { - return true; - } - - if (mkdir($path, 0755, true)) { - return true; - } else { - $this->error = "目录 {$path} 创建失败!"; - return false; - } - } - - /** - * 获取文件类型信息 - * @return string - */ - public function getMime() - { - $finfo = finfo_open(FILEINFO_MIME_TYPE); - return finfo_file($finfo, $this->filename); - } - - /** - * 设置文件的命名规则 - * @param string $rule 文件命名规则 - * @return $this - */ - public function rule($rule) - { - $this->rule = $rule; - return $this; - } - - /** - * 设置上传文件的验证规则 - * @param array $rule 验证规则 - * @return $this - */ - public function validate($rule = []) - { - $this->validate = $rule; - return $this; - } - - /** - * 检测是否合法的上传文件 - * @return bool - */ - public function isValid() - { - if ($this->isTest) { - return is_file($this->filename); - } - return is_uploaded_file($this->filename); - } - - /** - * 检测上传文件 - * @param array $rule 验证规则 - * @return bool - */ - public function check($rule = []) - { - $rule = $rule ?: $this->validate; - - /* 检查文件大小 */ - if (isset($rule['size']) && !$this->checkSize($rule['size'])) { - $this->error = '上传文件大小不符!'; - return false; - } - - /* 检查文件Mime类型 */ - if (isset($rule['type']) && !$this->checkMime($rule['type'])) { - $this->error = '上传文件MIME类型不允许!'; - return false; - } - - /* 检查文件后缀 */ - if (isset($rule['ext']) && !$this->checkExt($rule['ext'])) { - $this->error = '上传文件后缀不允许'; - return false; - } - - /* 检查图像文件 */ - if (!$this->checkImg()) { - $this->error = '非法图像文件!'; - return false; - } - - return true; - } - - /** - * 检测上传文件后缀 - * @param array|string $ext 允许后缀 - * @return bool - */ - public function checkExt($ext) - { - if (is_string($ext)) { - $ext = explode(',', $ext); - } - $extension = strtolower(pathinfo($this->getInfo('name'), PATHINFO_EXTENSION)); - if (!in_array($extension, $ext)) { - return false; - } - return true; - } - - /** - * 检测图像文件 - * @return bool - */ - public function checkImg() - { - $extension = strtolower(pathinfo($this->getInfo('name'), PATHINFO_EXTENSION)); - /* 对图像文件进行严格检测 */ - if (in_array($extension, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf']) && !in_array($this->getImageType($this->filename), [1, 2, 3, 4, 6])) { - return false; - } - return true; - } - - // 判断图像类型 - protected function getImageType($image) - { - if (function_exists('exif_imagetype')) { - return exif_imagetype($image); - } else { - $info = getimagesize($image); - return $info[2]; - } - } - - /** - * 检测上传文件大小 - * @param integer $size 最大大小 - * @return bool - */ - public function checkSize($size) - { - if ($this->getSize() > $size) { - return false; - } - return true; - } - - /** - * 检测上传文件类型 - * @param array|string $mime 允许类型 - * @return bool - */ - public function checkMime($mime) - { - if (is_string($mime)) { - $mime = explode(',', $mime); - } - if (!in_array(strtolower($this->getMime()), $mime)) { - return false; - } - return true; - } - - /** - * 移动文件 - * @param string $path 保存路径 - * @param string|bool $savename 保存的文件名 默认自动生成 - * @param boolean $replace 同名文件是否覆盖 - * @return false|SplFileInfo false-失败 否则返回SplFileInfo实例 - */ - public function move($path, $savename = true, $replace = true) - { - // 文件上传失败,捕获错误代码 - if (!empty($this->info['error'])) { - $this->error($this->info['error']); - return false; - } - - // 检测合法性 - if (!$this->isValid()) { - $this->error = '非法上传文件'; - return false; - } - - // 验证上传 - if (!$this->check()) { - return false; - } - $path = rtrim($path, DS) . DS; - // 文件保存命名规则 - $saveName = $this->buildSaveName($savename); - $filename = $path . $saveName; - - // 检测目录 - if (false === $this->checkPath(dirname($filename))) { - return false; - } - - /* 不覆盖同名文件 */ - if (!$replace && is_file($filename)) { - $this->error = '存在同名文件' . $filename; - return false; - } - - /* 移动文件 */ - if ($this->isTest) { - rename($this->filename, $filename); - } elseif (!move_uploaded_file($this->filename, $filename)) { - $this->error = '文件上传保存错误!'; - return false; - } - // 返回 File对象实例 - $file = new self($filename); - $file->setSaveName($saveName); - $file->setUploadInfo($this->info); - return $file; - } - - /** - * 获取保存文件名 - * @param string|bool $savename 保存的文件名 默认自动生成 - * @return string - */ - protected function buildSaveName($savename) - { - if (true === $savename) { - // 自动生成文件名 - if ($this->rule instanceof \Closure) { - $savename = call_user_func_array($this->rule, [$this]); - } else { - switch ($this->rule) { - case 'date': - $savename = date('Ymd') . DS . md5(microtime(true)); - break; - default: - if (in_array($this->rule, hash_algos())) { - $hash = $this->hash($this->rule); - $savename = substr($hash, 0, 2) . DS . substr($hash, 2); - } elseif (is_callable($this->rule)) { - $savename = call_user_func($this->rule); - } else { - $savename = date('Ymd') . DS . md5(microtime(true)); - } - } - } - } elseif ('' === $savename) { - $savename = $this->getInfo('name'); - } - if (!strpos($savename, '.')) { - $savename .= '.' . pathinfo($this->getInfo('name'), PATHINFO_EXTENSION); - } - return $savename; - } - - /** - * 获取错误代码信息 - * @param int $errorNo 错误号 - */ - private function error($errorNo) - { - switch ($errorNo) { - case 1: - case 2: - $this->error = '上传文件大小超过了最大值!'; - break; - case 3: - $this->error = '文件只有部分被上传!'; - break; - case 4: - $this->error = '没有文件被上传!'; - break; - case 6: - $this->error = '找不到临时文件夹!'; - break; - case 7: - $this->error = '文件写入失败!'; - break; - default: - $this->error = '未知上传错误!'; - } - } - - /** - * 获取错误信息 - * @return mixed - */ - public function getError() - { - return $this->error; - } - - public function __call($method, $args) - { - return $this->hash($method); - } -} diff --git a/thinkphp/library/think/Hook.php b/thinkphp/library/think/Hook.php deleted file mode 100755 index 062ac96..0000000 --- a/thinkphp/library/think/Hook.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php - -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\App; -use think\Debug; -use think\Log; - -class Hook -{ - - private static $tags = []; - - /** - * 动态添加行为扩展到某个标签 - * @param string $tag 标签名称 - * @param mixed $behavior 行为名称 - * @param bool $first 是否放到开头执行 - * @return void - */ - public static function add($tag, $behavior, $first = false) - { - isset(self::$tags[$tag]) || self::$tags[$tag] = []; - if (is_array($behavior) && !is_callable($behavior)) { - if (!array_key_exists('_overlay', $behavior) || !$behavior['_overlay']) { - unset($behavior['_overlay']); - self::$tags[$tag] = array_merge(self::$tags[$tag], $behavior); - } else { - unset($behavior['_overlay']); - self::$tags[$tag] = $behavior; - } - } elseif ($first) { - array_unshift(self::$tags[$tag], $behavior); - } else { - self::$tags[$tag][] = $behavior; - } - } - - /** - * 批量导入插件 - * @param array $tags 插件信息 - * @param boolean $recursive 是否递归合并 - */ - public static function import(array $tags, $recursive = true) - { - if ($recursive) { - foreach ($tags as $tag => $behavior) { - self::add($tag, $behavior); - } - } else { - self::$tags = $tags + self::$tags; - } - } - - /** - * 获取插件信息 - * @param string $tag 插件位置 留空获取全部 - * @return array - */ - public static function get($tag = '') - { - if (empty($tag)) {//获取全部的插件信息 - return self::$tags; - } else { - return array_key_exists($tag, self::$tags) ? self::$tags[$tag] : []; - } - } - - /** - * 监听标签的行为 - * @param string $tag 标签名称 - * @param mixed $params 传入参数 - * @param mixed $extra 额外参数 - * @param bool $once 只获取一个有效返回值 - * @return mixed - */ - public static function listen($tag, &$params = null, $extra = null, $once = false) - { - $results = []; - $tags = static::get($tag); - foreach ($tags as $key => $name) { - $results[$key] = self::exec($name, $tag, $params, $extra); - if (false === $results[$key]) {// 如果返回false 则中断行为执行 - break; - } elseif (!is_null($results[$key]) && $once) { - break; - } - } - return $once ? end($results) : $results; - } - - /** - * 执行某个行为 - * @param mixed $class 要执行的行为 - * @param string $tag 方法名(标签名) - * @param Mixed $params 传人的参数 - * @param mixed $extra 额外参数 - * @return mixed - */ - public static function exec($class, $tag = '', &$params = null, $extra = null) - { - App::$debug && Debug::remark('behavior_start', 'time'); - if (is_callable($class)) { - $result = call_user_func_array($class, [ & $params, $extra]); - $class = 'Closure'; - } elseif (is_object($class)) { - $result = call_user_func_array([$class, $tag], [ & $params, $extra]); - $class = get_class($class); - } else { - $obj = new $class(); - $result = ($tag && is_callable([$obj, $tag])) ? $obj->$tag($params, $extra) : $obj->run($params, $extra); - } - if (App::$debug) { - Debug::remark('behavior_end', 'time'); - Log::record('[ BEHAVIOR ] Run ' . $class . ' @' . $tag . ' [ RunTime:' . Debug::getRangeTime('behavior_start', 'behavior_end') . 's ]', 'info'); - } - return $result; - } - -} diff --git a/thinkphp/library/think/Lang.php b/thinkphp/library/think/Lang.php deleted file mode 100755 index e064ae4..0000000 --- a/thinkphp/library/think/Lang.php +++ /dev/null @@ -1,221 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\App; -use think\Cookie; -use think\Log; - -class Lang -{ - // 语言数据 - private static $lang = []; - // 语言作用域 - private static $range = 'zh-cn'; - // 语言自动侦测的变量 - protected static $langDetectVar = 'lang'; - // 语言Cookie变量 - protected static $langCookieVar = 'think_var'; - // 语言Cookie的过期时间 - protected static $langCookieExpire = 3600; - // 允许语言列表 - protected static $allowLangList = []; - - // 设定当前的语言 - public static function range($range = '') - { - if ('' == $range) { - return self::$range; - } else { - self::$range = $range; - } - } - - /** - * 设置语言定义(不区分大小写) - * @param string|array $name 语言变量 - * @param string $value 语言值 - * @param string $range 语言作用域 - * @return mixed - */ - public static function set($name, $value = null, $range = '') - { - $range = $range ?: self::$range; - // 批量定义 - if (!isset(self::$lang[$range])) { - self::$lang[$range] = []; - } - if (is_array($name)) { - return self::$lang[$range] = array_change_key_case($name) + self::$lang[$range]; - } else { - return self::$lang[$range][strtolower($name)] = $value; - } - } - - /** - * 加载语言定义(不区分大小写) - * @param string $file 语言文件 - * @param string $range 语言作用域 - * @return mixed - */ - public static function load($file, $range = '') - { - $range = $range ?: self::$range; - if (!isset(self::$lang[$range])) { - self::$lang[$range] = []; - } - // 批量定义 - if (is_string($file)) { - $file = [$file]; - } - $lang = []; - foreach ($file as $_file) { - if (is_file($_file)) { - // 记录加载信息 - App::$debug && Log::record('[ LANG ] ' . $_file, 'info'); - $_lang = include $_file; - if (is_array($_lang)) { - $lang = array_change_key_case($_lang) + $lang; - } - } - } - if (!empty($lang)) { - self::$lang[$range] = $lang + self::$lang[$range]; - } - return self::$lang[$range]; - } - - /** - * 获取语言定义(不区分大小写) - * @param string|null $name 语言变量 - * @param array $vars 变量替换 - * @param string $range 语言作用域 - * @return mixed - */ - public static function has($name, $range = '') - { - $range = $range ?: self::$range; - return isset(self::$lang[$range][strtolower($name)]); - } - - /** - * 获取语言定义(不区分大小写) - * @param string|null $name 语言变量 - * @param array $vars 变量替换 - * @param string $range 语言作用域 - * @return mixed - */ - public static function get($name = null, $vars = [], $range = '') - { - $range = $range ?: self::$range; - // 空参数返回所有定义 - if (empty($name)) { - return self::$lang[$range]; - } - $key = strtolower($name); - $value = isset(self::$lang[$range][$key]) ? self::$lang[$range][$key] : $name; - - // 变量解析 - if (!empty($vars) && is_array($vars)) { - /** - * Notes: - * 为了检测的方便,数字索引的判断仅仅是参数数组的第一个元素的key为数字0 - * 数字索引采用的是系统的 sprintf 函数替换,用法请参考 sprintf 函数 - */ - if (key($vars) === 0) { - // 数字索引解析 - array_unshift($vars, $value); - $value = call_user_func_array('sprintf', $vars); - } else { - // 关联索引解析 - $replace = array_keys($vars); - foreach ($replace as &$v) { - $v = "{:{$v}}"; - } - $value = str_replace($replace, $vars, $value); - } - - } - return $value; - } - - /** - * 自动侦测设置获取语言选择 - * @return string - */ - public static function detect() - { - // 自动侦测设置获取语言选择 - $langSet = ''; - if (isset($_GET[self::$langDetectVar])) { - // url中设置了语言变量 - $langSet = strtolower($_GET[self::$langDetectVar]); - Cookie::set(self::$langCookieVar, $langSet, self::$langCookieExpire); - } elseif (Cookie::get(self::$langCookieVar)) { - // 获取上次用户的选择 - $langSet = strtolower(Cookie::get(self::$langCookieVar)); - } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - // 自动侦测浏览器语言 - preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches); - $langSet = strtolower($matches[1]); - Cookie::set(self::$langCookieVar, $langSet, self::$langCookieExpire); - } - if (empty(self::$allowLangList) || in_array($langSet, self::$allowLangList)) { - // 合法的语言 - self::$range = $langSet ?: self::$range; - } - if ('zh-hans-cn' == self::$range) { - self::$range = 'zh-cn'; - } - return self::$range; - } - - /** - * 设置语言自动侦测的变量 - * @param string $var 变量名称 - * @return void - */ - public static function setLangDetectVar($var) - { - self::$langDetectVar = $var; - } - - /** - * 设置语言的cookie保存变量 - * @param string $var 变量名称 - * @return void - */ - public static function setLangCookieVar($var) - { - self::$langCookieVar = $var; - } - - /** - * 设置语言的cookie的过期时间 - * @param string $expire 过期时间 - * @return void - */ - public static function setLangCookieExpire($expire) - { - self::$langCookieExpire = $expire; - } - - /** - * 设置允许的语言列表 - * @param array $list 语言列表 - * @return void - */ - public static function setAllowLangList($list) - { - self::$allowLangList = $list; - } -} diff --git a/thinkphp/library/think/Loader.php b/thinkphp/library/think/Loader.php deleted file mode 100755 index 9f54ad3..0000000 --- a/thinkphp/library/think/Loader.php +++ /dev/null @@ -1,551 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\exception\ClassNotFoundException; - -class Loader -{ - protected static $instance = []; - // 类名映射 - protected static $map = []; - - // 命名空间别名 - protected static $namespaceAlias = []; - - // PSR-4 - private static $prefixLengthsPsr4 = []; - private static $prefixDirsPsr4 = []; - private static $fallbackDirsPsr4 = []; - - // PSR-0 - private static $prefixesPsr0 = []; - private static $fallbackDirsPsr0 = []; - - // 自动加载的文件 - private static $autoloadFiles = []; - - // 自动加载 - public static function autoload($class) - { - // 检测命名空间别名 - if (!empty(self::$namespaceAlias)) { - $namespace = dirname($class); - if (isset(self::$namespaceAlias[$namespace])) { - $original = self::$namespaceAlias[$namespace] . '\\' . basename($class); - if (class_exists($original)) { - return class_alias($original, $class, false); - } - } - } - - if ($file = self::findFile($class)) { - - // Win环境严格区分大小写 - if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) { - return false; - } - - __include_file($file); - return true; - } - } - - /** - * 查找文件 - * @param $class - * @return bool - */ - private static function findFile($class) - { - if (!empty(self::$map[$class])) { - // 类库映射 - return self::$map[$class]; - } - - // 查找 PSR-4 - $logicalPathPsr4 = strtr($class, '\\', DS) . EXT; - - $first = $class[0]; - if (isset(self::$prefixLengthsPsr4[$first])) { - foreach (self::$prefixLengthsPsr4[$first] as $prefix => $length) { - if (0 === strpos($class, $prefix)) { - foreach (self::$prefixDirsPsr4[$prefix] as $dir) { - if (is_file($file = $dir . DS . substr($logicalPathPsr4, $length))) { - return $file; - } - } - } - } - } - - // 查找 PSR-4 fallback dirs - foreach (self::$fallbackDirsPsr4 as $dir) { - if (is_file($file = $dir . DS . $logicalPathPsr4)) { - return $file; - } - } - - // 查找 PSR-0 - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DS); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DS) . EXT; - } - - if (isset(self::$prefixesPsr0[$first])) { - foreach (self::$prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (is_file($file = $dir . DS . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // 查找 PSR-0 fallback dirs - foreach (self::$fallbackDirsPsr0 as $dir) { - if (is_file($file = $dir . DS . $logicalPathPsr0)) { - return $file; - } - } - - return self::$map[$class] = false; - } - - // 注册classmap - public static function addClassMap($class, $map = '') - { - if (is_array($class)) { - self::$map = array_merge(self::$map, $class); - } else { - self::$map[$class] = $map; - } - } - - // 注册命名空间 - public static function addNamespace($namespace, $path = '') - { - if (is_array($namespace)) { - foreach ($namespace as $prefix => $paths) { - self::addPsr4($prefix . '\\', rtrim($paths, DS), true); - } - } else { - self::addPsr4($namespace . '\\', rtrim($path, DS), true); - } - } - - // 添加Ps0空间 - private static function addPsr0($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - self::$fallbackDirsPsr0 = array_merge( - (array) $paths, - self::$fallbackDirsPsr0 - ); - } else { - self::$fallbackDirsPsr0 = array_merge( - self::$fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset(self::$prefixesPsr0[$first][$prefix])) { - self::$prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - self::$prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - self::$prefixesPsr0[$first][$prefix] - ); - } else { - self::$prefixesPsr0[$first][$prefix] = array_merge( - self::$prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - // 添加Psr4空间 - private static function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - self::$fallbackDirsPsr4 = array_merge( - (array) $paths, - self::$fallbackDirsPsr4 - ); - } else { - self::$fallbackDirsPsr4 = array_merge( - self::$fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset(self::$prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - self::$prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - self::$prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - self::$prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - self::$prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - self::$prefixDirsPsr4[$prefix] = array_merge( - self::$prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - // 注册命名空间别名 - public static function addNamespaceAlias($namespace, $original = '') - { - if (is_array($namespace)) { - self::$namespaceAlias = array_merge(self::$namespaceAlias, $namespace); - } else { - self::$namespaceAlias[$namespace] = $original; - } - } - - // 注册自动加载机制 - public static function register($autoload = '') - { - // 注册系统自动加载 - spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true); - // 注册命名空间定义 - self::addNamespace([ - 'think' => LIB_PATH . 'think' . DS, - 'behavior' => LIB_PATH . 'behavior' . DS, - 'traits' => LIB_PATH . 'traits' . DS, - ]); - // 加载类库映射文件 - if (is_file(RUNTIME_PATH . 'classmap' . EXT)) { - self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT)); - } - - // Composer自动加载支持 - if (is_dir(VENDOR_PATH . 'composer')) { - self::registerComposerLoader(); - } - - // 自动加载extend目录 - self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS); - } - - // 注册composer自动加载 - private static function registerComposerLoader() - { - if (is_file(VENDOR_PATH . 'composer/autoload_namespaces.php')) { - $map = require VENDOR_PATH . 'composer/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - self::addPsr0($namespace, $path); - } - } - - if (is_file(VENDOR_PATH . 'composer/autoload_psr4.php')) { - $map = require VENDOR_PATH . 'composer/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - self::addPsr4($namespace, $path); - } - } - - if (is_file(VENDOR_PATH . 'composer/autoload_classmap.php')) { - $classMap = require VENDOR_PATH . 'composer/autoload_classmap.php'; - if ($classMap) { - self::addClassMap($classMap); - } - } - - if (is_file(VENDOR_PATH . 'composer/autoload_files.php')) { - $includeFiles = require VENDOR_PATH . 'composer/autoload_files.php'; - foreach ($includeFiles as $fileIdentifier => $file) { - if (empty(self::$autoloadFiles[$fileIdentifier])) { - __require_file($file); - self::$autoloadFiles[$fileIdentifier] = true; - } - } - } - } - - /** - * 导入所需的类库 同java的Import 本函数有缓存功能 - * @param string $class 类库命名空间字符串 - * @param string $baseUrl 起始路径 - * @param string $ext 导入的文件扩展名 - * @return boolean - */ - public static function import($class, $baseUrl = '', $ext = EXT) - { - static $_file = []; - $key = $class . $baseUrl; - $class = str_replace(['.', '#'], [DS, '.'], $class); - if (isset($_file[$key])) { - return true; - } - - if (empty($baseUrl)) { - list($name, $class) = explode(DS, $class, 2); - - if (isset(self::$prefixDirsPsr4[$name . '\\'])) { - // 注册的命名空间 - $baseUrl = self::$prefixDirsPsr4[$name . '\\']; - } elseif ('@' == $name) { - //加载当前模块应用类库 - $baseUrl = App::$modulePath; - } elseif (is_dir(EXTEND_PATH . $name)) { - $baseUrl = EXTEND_PATH . $name . DS; - } else { - // 加载其它模块的类库 - $baseUrl = APP_PATH . $name . DS; - } - } elseif (substr($baseUrl, -1) != DS) { - $baseUrl .= DS; - } - // 如果类存在 则导入类库文件 - if (is_array($baseUrl)) { - foreach ($baseUrl as $path) { - $filename = $path . DS . $class . $ext; - if (is_file($filename)) { - break; - } - } - } else { - $filename = $baseUrl . $class . $ext; - } - - if (!empty($filename) && is_file($filename)) { - // 开启调试模式Win环境严格区分大小写 - if (IS_WIN && pathinfo($filename, PATHINFO_FILENAME) != pathinfo(realpath($filename), PATHINFO_FILENAME)) { - return false; - } - __include_file($filename); - $_file[$key] = true; - return true; - } - return false; - } - - /** - * 实例化(分层)模型 - * @param string $name Model名称 - * @param string $layer 业务层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @param string $common 公共模块名 - * @return Object - * @throws ClassNotFoundException - */ - public static function model($name = '', $layer = 'model', $appendSuffix = false, $common = 'common') - { - $guid = $name . $layer; - if (isset(self::$instance[$guid])) { - return self::$instance[$guid]; - } - if (strpos($name, '/')) { - list($module, $name) = explode('/', $name, 2); - } else { - $module = Request::instance()->module(); - } - $class = self::parseClass($module, $layer, $name, $appendSuffix); - if (class_exists($class)) { - $model = new $class(); - } else { - $class = str_replace('\\' . $module . '\\', '\\' . $common . '\\', $class); - if (class_exists($class)) { - $model = new $class(); - } else { - throw new ClassNotFoundException('class not exists:' . $class, $class); - } - } - self::$instance[$guid] = $model; - return $model; - } - - /** - * 实例化(分层)控制器 格式:[模块名/]控制器名 - * @param string $name 资源地址 - * @param string $layer 控制层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @param string $empty 空控制器名称 - * @return Object|false - * @throws ClassNotFoundException - */ - public static function controller($name, $layer = 'controller', $appendSuffix = false, $empty = '') - { - if (strpos($name, '/')) { - list($module, $name) = explode('/', $name); - } else { - $module = Request::instance()->module(); - } - $class = self::parseClass($module, $layer, $name, $appendSuffix); - if (class_exists($class)) { - return App::invokeClass($class); - } elseif ($empty && class_exists($emptyClass = self::parseClass($module, $layer, $empty, $appendSuffix))) { - return new $emptyClass(Request::instance()); - } - } - - /** - * 实例化验证类 格式:[模块名/]验证器名 - * @param string $name 资源地址 - * @param string $layer 验证层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @param string $common 公共模块名 - * @return Object|false - * @throws ClassNotFoundException - */ - public static function validate($name = '', $layer = 'validate', $appendSuffix = false, $common = 'common') - { - $name = $name ?: Config::get('default_validate'); - if (empty($name)) { - return new Validate; - } - $guid = $name . $layer; - if (isset(self::$instance[$guid])) { - return self::$instance[$guid]; - } - if (strpos($name, '/')) { - list($module, $name) = explode('/', $name); - } else { - $module = Request::instance()->module(); - } - $class = self::parseClass($module, $layer, $name, $appendSuffix); - if (class_exists($class)) { - $validate = new $class; - } else { - $class = str_replace('\\' . $module . '\\', '\\' . $common . '\\', $class); - if (class_exists($class)) { - $validate = new $class; - } else { - throw new ClassNotFoundException('class not exists:' . $class, $class); - } - } - self::$instance[$guid] = $validate; - return $validate; - } - - /** - * 数据库初始化 并取得数据库类实例 - * @param mixed $config 数据库配置 - * @param bool|string $name 连接标识 true 强制重新连接 - * @return \think\db\Connection - */ - public static function db($config = [], $name = false) - { - return Db::connect($config, $name); - } - - /** - * 远程调用模块的操作方法 参数格式 [模块/控制器/]操作 - * @param string $url 调用地址 - * @param string|array $vars 调用参数 支持字符串和数组 - * @param string $layer 要调用的控制层名称 - * @param bool $appendSuffix 是否添加类名后缀 - * @return mixed - */ - public static function action($url, $vars = [], $layer = 'controller', $appendSuffix = false) - { - $info = pathinfo($url); - $action = $info['basename']; - $module = '.' != $info['dirname'] ? $info['dirname'] : Request::instance()->controller(); - $class = self::controller($module, $layer, $appendSuffix); - if ($class) { - if (is_scalar($vars)) { - if (strpos($vars, '=')) { - parse_str($vars, $vars); - } else { - $vars = [$vars]; - } - } - return App::invokeMethod([$class, $action . Config::get('action_suffix')], $vars); - } - } - - /** - * 字符串命名风格转换 - * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格 - * @param string $name 字符串 - * @param integer $type 转换类型 - * @return string - */ - public static function parseName($name, $type = 0) - { - if ($type) { - return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function ($match) { - return strtoupper($match[1]); - }, $name)); - } else { - return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_")); - } - } - - /** - * 解析应用类的类名 - * @param string $module 模块名 - * @param string $layer 层名 controller model ... - * @param string $name 类名 - * @param bool $appendSuffix - * @return string - */ - public static function parseClass($module, $layer, $name, $appendSuffix = false) - { - $name = str_replace(['/', '.'], '\\', $name); - $array = explode('\\', $name); - $class = self::parseName(array_pop($array), 1) . (App::$suffix || $appendSuffix ? ucfirst($layer) : ''); - $path = $array ? implode('\\', $array) . '\\' : ''; - return App::$namespace . '\\' . ($module ? $module . '\\' : '') . $layer . '\\' . $path . $class; - } - - /** - * 初始化类的实例 - * @return void - */ - public static function clearInstance() - { - self::$instance = []; - } -} - -/** - * 作用范围隔离 - * - * @param $file - * @return mixed - */ -function __include_file($file) -{ - return include $file; -} - -function __require_file($file) -{ - return require $file; -} diff --git a/thinkphp/library/think/Log.php b/thinkphp/library/think/Log.php deleted file mode 100755 index 5fd1631..0000000 --- a/thinkphp/library/think/Log.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\exception\ClassNotFoundException; - -/** - * Class Log - * @package think - * - * @method void log($msg) static - * @method void error($msg) static - * @method void info($msg) static - * @method void sql($msg) static - * @method void notice($msg) static - * @method void alert($msg) static - */ -class Log -{ - const LOG = 'log'; - const ERROR = 'error'; - const INFO = 'info'; - const SQL = 'sql'; - const NOTICE = 'notice'; - const ALERT = 'alert'; - - // 日志信息 - protected static $log = []; - // 配置参数 - protected static $config = []; - // 日志类型 - protected static $type = ['log', 'error', 'info', 'sql', 'notice', 'alert']; - // 日志写入驱动 - protected static $driver; - - // 当前日志授权key - protected static $key; - - /** - * 日志初始化 - * @param array $config - */ - public static function init($config = []) - { - $type = isset($config['type']) ? $config['type'] : 'File'; - $class = false !== strpos($type, '\\') ? $type : '\\think\\log\\driver\\' . ucwords($type); - self::$config = $config; - unset($config['type']); - if (class_exists($class)) { - self::$driver = new $class($config); - } else { - throw new ClassNotFoundException('class not exists:' . $class, $class); - } - // 记录初始化信息 - App::$debug && Log::record('[ LOG ] INIT ' . $type, 'info'); - } - - /** - * 获取日志信息 - * @param string $type 信息类型 - * @return array - */ - public static function getLog($type = '') - { - return $type ? self::$log[$type] : self::$log; - } - - /** - * 记录调试信息 - * @param mixed $msg 调试信息 - * @param string $type 信息类型 - * @return void - */ - public static function record($msg, $type = 'log') - { - self::$log[$type][] = $msg; - } - - /** - * 清空日志信息 - * @return void - */ - public static function clear() - { - self::$log = []; - } - - /** - * 当前日志记录的授权key - * @param string $key 授权key - * @return void - */ - public static function key($key) - { - self::$key = $key; - } - - /** - * 检查日志写入权限 - * @param array $config 当前日志配置参数 - * @return bool - */ - public static function check($config) - { - if (self::$key && !empty($config['allow_key']) && !in_array(self::$key, $config['allow_key'])) { - return false; - } - return true; - } - - /** - * 保存调试信息 - * @return bool - */ - public static function save() - { - if (!empty(self::$log)) { - if (is_null(self::$driver)) { - self::init(Config::get('log')); - } - - if (!self::check(self::$config)) { - // 检测日志写入权限 - return false; - } - - if (empty(self::$config['level'])) { - // 获取全部日志 - $log = self::$log; - } else { - // 记录允许级别 - $log = []; - foreach (self::$config['level'] as $level) { - if (isset(self::$log[$level])) { - $log[$level] = self::$log[$level]; - } - } - } - - $result = self::$driver->save($log); - if ($result) { - self::$log = []; - } - - return $result; - } - return true; - } - - /** - * 实时写入日志信息 并支持行为 - * @param mixed $msg 调试信息 - * @param string $type 信息类型 - * @param bool $force 是否强制写入 - * @return bool - */ - public static function write($msg, $type = 'log', $force = false) - { - // 封装日志信息 - if (true === $force || empty(self::$config['level'])) { - $log[$type][] = $msg; - } elseif (in_array($type, self::$config['level'])) { - $log[$type][] = $msg; - } else { - return false; - } - - // 监听log_write - Hook::listen('log_write', $log); - if (is_null(self::$driver)) { - self::init(Config::get('log')); - } - // 写入日志 - return self::$driver->save($log); - } - - /** - * 静态调用 - * @param $method - * @param $args - * @return mixed - */ - public static function __callStatic($method, $args) - { - if (in_array($method, self::$type)) { - array_push($args, $method); - return call_user_func_array('\\think\\Log::record', $args); - } - } - -} diff --git a/thinkphp/library/think/Model.php b/thinkphp/library/think/Model.php deleted file mode 100755 index aed24f7..0000000 --- a/thinkphp/library/think/Model.php +++ /dev/null @@ -1,1467 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use InvalidArgumentException; -use think\Cache; -use think\Config; -use think\Db; -use think\db\Query; -use think\Exception; -use think\Exception\ValidateException; -use think\Loader; -use think\model\Relation; -use think\paginator\Collection as PaginatorCollection; - -/** - * Class Model - * @package think - * @method static PaginatorCollection paginate(integer $listRows = 15, boolean $simple = false, array $config = []) 分页查询 - * @method static mixed value($field, $default = null) 得到某个字段的值 - * @method static array column($field, $key = '') 得到某个列的数组 - * @method static integer count($field = '*') COUNT查询 - * @method static integer sum($field = '*') SUM查询 - * @method static integer min($field = '*') MIN查询 - * @method static integer max($field = '*') MAX查询 - * @method static integer avg($field = '*') AVG查询 - * @method static setField($field, $value = '') - * @method static Query where($field, $op = null, $condition = null) 指定AND查询条件 - * @method static static findOrFail($data = null) 查找单条记录 如果不存在则抛出异常 - * - */ -abstract class Model implements \JsonSerializable, \ArrayAccess -{ - // 数据库对象池 - protected static $links = []; - // 数据库配置 - protected $connection = []; - // 数据库查询对象 - protected $query; - // 当前模型名称 - protected $name; - // 数据表名称 - protected $table; - // 当前类名称 - protected $class; - // 回调事件 - private static $event = []; - // 错误信息 - protected $error; - // 字段验证规则 - protected $validate; - // 数据表主键 复合主键使用数组定义 不设置则自动获取 - protected $pk; - // 数据表字段信息 留空则自动获取 - protected $field = []; - // 只读字段 - protected $readonly = []; - // 显示属性 - protected $visible = []; - // 隐藏属性 - protected $hidden = []; - // 追加属性 - protected $append = []; - // 数据信息 - protected $data = []; - // 记录改变字段 - protected $change = []; - - // 保存自动完成列表 - protected $auto = []; - // 新增自动完成列表 - protected $insert = []; - // 更新自动完成列表 - protected $update = []; - // 是否需要自动写入时间戳 如果设置为字符串 则表示时间字段的类型 - protected $autoWriteTimestamp; - // 创建时间字段 - protected $createTime = 'create_time'; - // 更新时间字段 - protected $updateTime = 'update_time'; - // 时间字段取出后的默认时间格式 - protected $dateFormat = 'Y-m-d H:i:s'; - // 字段类型或者格式转换 - protected $type = []; - // 是否为更新数据 - protected $isUpdate = false; - // 更新条件 - protected $updateWhere; - // 当前执行的关联对象 - protected $relation; - // 验证失败是否抛出异常 - protected $failException = false; - // 全局查询范围 - protected $useGlobalScope = true; - // 是否采用批量验证 - protected $batchValidate = false; - - /** - * 初始化过的模型. - * - * @var array - */ - protected static $initialized = []; - - /** - * 架构函数 - * @access public - * @param array|object $data 数据 - */ - public function __construct($data = []) - { - if (is_object($data)) { - $this->data = get_object_vars($data); - } else { - $this->data = $data; - } - - // 当前类名 - $this->class = get_class($this); - - if (empty($this->name)) { - // 当前模型名 - $name = str_replace('\\', '/', $this->class); - $this->name = basename($name); - if (Config::get('class_suffix')) { - $suffix = basename(dirname($name)); - $this->name = substr($this->name, 0, -strlen($suffix)); - } - } - - if (is_null($this->autoWriteTimestamp)) { - // 自动写入时间戳 - $this->autoWriteTimestamp = $this->db()->getConfig('auto_timestamp'); - } - - // 执行初始化操作 - $this->initialize(); - } - - /** - * 获取当前模型的数据库查询对象 - * @access public - * @param bool $baseQuery 是否调用全局查询范围 - * @return Query - */ - public function db($baseQuery = true) - { - $model = $this->class; - if (!isset(self::$links[$model])) { - // 设置当前模型 确保查询返回模型对象 - $query = Db::connect($this->connection)->model($model, $this->query); - - // 设置当前数据表和模型名 - if (!empty($this->table)) { - $query->setTable($this->table); - } else { - $query->name($this->name); - } - - if (!empty($this->pk)) { - $query->pk($this->pk); - } - - self::$links[$model] = $query; - } - // 全局作用域 - if ($baseQuery && method_exists($this, 'base')) { - call_user_func_array([$this, 'base'], [ & self::$links[$model]]); - } - // 返回当前模型的数据库查询对象 - return self::$links[$model]; - } - - /** - * 获取关联模型实例 - * @access protected - * @param string|array $relation 关联查询 - * @return Relation|Query - */ - protected function relation($relation = null) - { - if (!is_null($relation)) { - // 执行关联查询 - return $this->db()->relation($relation); - } - - // 获取关联对象实例 - if (is_null($this->relation)) { - $this->relation = new Relation($this); - } - return $this->relation; - } - - /** - * 初始化模型 - * @access protected - * @return void - */ - protected function initialize() - { - $class = get_class($this); - if (!isset(static::$initialized[$class])) { - static::$initialized[$class] = true; - static::init(); - } - } - - /** - * 初始化处理 - * @access protected - * @return void - */ - protected static function init() - {} - - /** - * 设置数据对象值 - * @access public - * @param mixed $data 数据或者属性名 - * @param mixed $value 值 - * @return $this - */ - public function data($data, $value = null) - { - if (is_string($data)) { - $this->data[$data] = $value; - } else { - // 清空数据 - $this->data = []; - if (is_object($data)) { - $data = get_object_vars($data); - } - if (true === $value) { - // 数据对象赋值 - foreach ($data as $key => $value) { - $this->setAttr($key, $value, $data); - } - } else { - $this->data = $data; - } - } - return $this; - } - - /** - * 获取对象原始数据 如果不存在指定字段返回false - * @access public - * @param string $name 字段名 留空获取全部 - * @return mixed - * @throws InvalidArgumentException - */ - public function getData($name = null) - { - if (is_null($name)) { - return $this->data; - } elseif (array_key_exists($name, $this->data)) { - return $this->data[$name]; - } else { - throw new InvalidArgumentException('property not exists:' . $this->class . '->' . $name); - } - } - - /** - * 修改器 设置数据对象值 - * @access public - * @param string $name 属性名 - * @param mixed $value 属性值 - * @param array $data 数据 - * @return $this - */ - public function setAttr($name, $value, $data = []) - { - if (is_null($value) && $this->autoWriteTimestamp && in_array($name, [$this->createTime, $this->updateTime])) { - // 自动写入的时间戳字段 - $value = $this->autoWriteTimestamp($name); - } else { - // 检测修改器 - $method = 'set' . Loader::parseName($name, 1) . 'Attr'; - if (method_exists($this, $method)) { - $value = $this->$method($value, array_merge($data, $this->data)); - } elseif (isset($this->type[$name])) { - // 类型转换 - $value = $this->writeTransform($value, $this->type[$name]); - } - } - - // 标记字段更改 - if (!isset($this->data[$name]) || ($this->data[$name] != $value && !in_array($name, $this->change))) { - $this->change[] = $name; - } - // 设置数据对象属性 - $this->data[$name] = $value; - return $this; - } - - /** - * 自动写入时间戳 - * @access public - * @param string $name 时间戳字段 - * @return mixed - */ - protected function autoWriteTimestamp($name) - { - if (isset($this->type[$name])) { - $type = $this->type[$name]; - if (strpos($type, ':')) { - list($type, $param) = explode(':', $type, 2); - } - switch ($type) { - case 'datetime': - case 'date': - $format = !empty($param) ? $param : $this->dateFormat; - $value = date($format, $_SERVER['REQUEST_TIME']); - break; - case 'timestamp': - case 'int': - $value = $_SERVER['REQUEST_TIME']; - break; - } - } elseif (is_string($this->autoWriteTimestamp) && in_array(strtolower($this->autoWriteTimestamp), ['datetime', 'date', 'timestamp'])) { - $value = date($this->dateFormat, $_SERVER['REQUEST_TIME']); - } else { - $value = $_SERVER['REQUEST_TIME']; - } - return $value; - } - - /** - * 数据写入 类型转换 - * @access public - * @param mixed $value 值 - * @param string|array $type 要转换的类型 - * @return mixed - */ - protected function writeTransform($value, $type) - { - if (is_array($type)) { - list($type, $param) = $type; - } elseif (strpos($type, ':')) { - list($type, $param) = explode(':', $type, 2); - } - switch ($type) { - case 'integer': - $value = (int) $value; - break; - case 'float': - if (empty($param)) { - $value = (float) $value; - } else { - $value = (float) number_format($value, $param); - } - break; - case 'boolean': - $value = (bool) $value; - break; - case 'timestamp': - if (!is_numeric($value)) { - $value = strtotime($value); - } - break; - case 'datetime': - $format = !empty($param) ? $param : $this->dateFormat; - $value = date($format, is_numeric($value) ? $value : strtotime($value)); - break; - case 'object': - if (is_object($value)) { - $value = json_encode($value, JSON_FORCE_OBJECT); - } - break; - case 'array': - $value = (array) $value; - case 'json': - $option = !empty($param) ? (int) $param : JSON_UNESCAPED_UNICODE; - $value = json_encode($value, $option); - break; - case 'serialize': - $value = serialize($value); - break; - } - return $value; - } - - /** - * 获取器 获取数据对象的值 - * @access public - * @param string $name 名称 - * @return mixed - * @throws InvalidArgumentException - */ - public function getAttr($name) - { - try { - $notFound = false; - $value = $this->getData($name); - } catch (InvalidArgumentException $e) { - $notFound = true; - $value = null; - } - - // 检测属性获取器 - $method = 'get' . Loader::parseName($name, 1) . 'Attr'; - if (method_exists($this, $method)) { - $value = $this->$method($value, $this->data); - } elseif (isset($this->type[$name])) { - // 类型转换 - $value = $this->readTransform($value, $this->type[$name]); - } elseif ($notFound) { - $method = Loader::parseName($name, 1); - if (method_exists($this, $method) && !method_exists('\think\Model', $method)) { - // 不存在该字段 获取关联数据 - $value = $this->relation()->getRelation($method); - // 保存关联对象值 - $this->data[$name] = $value; - } else { - throw new InvalidArgumentException('property not exists:' . $this->class . '->' . $name); - } - } - return $value; - } - - /** - * 数据读取 类型转换 - * @access public - * @param mixed $value 值 - * @param string|array $type 要转换的类型 - * @return mixed - */ - protected function readTransform($value, $type) - { - if (is_array($type)) { - list($type, $param) = $type; - } elseif (strpos($type, ':')) { - list($type, $param) = explode(':', $type, 2); - } - switch ($type) { - case 'integer': - $value = (int) $value; - break; - case 'float': - if (empty($param)) { - $value = (float) $value; - } else { - $value = (float) number_format($value, $param); - } - break; - case 'boolean': - $value = (bool) $value; - break; - case 'timestamp': - if (!is_null($value)) { - $format = !empty($param) ? $param : $this->dateFormat; - $value = date($format, $value); - } - break; - case 'datetime': - if (!is_null($value)) { - $format = !empty($param) ? $param : $this->dateFormat; - $value = date($format, strtotime($value)); - } - break; - case 'json': - $value = json_decode($value, true); - break; - case 'array': - $value = is_null($value) ? [] : json_decode($value, true); - break; - case 'object': - $value = empty($value) ? new \stdClass() : json_decode($value); - break; - case 'serialize': - $value = unserialize($value); - break; - } - return $value; - } - - /** - * 设置需要追加的输出属性 - * @access public - * @param array $append 属性列表 - * @return $this - */ - public function append($append = []) - { - $this->append = $append; - return $this; - } - - /** - * 设置需要隐藏的输出属性 - * @access public - * @param array $hidden 属性列表 - * @return $this - */ - public function hidden($hidden = []) - { - $this->hidden = $hidden; - return $this; - } - - /** - * 设置需要输出的属性 - * @param array $visible - * @return $this - */ - public function visible($visible = []) - { - $this->visible = $visible; - return $this; - } - - /** - * 转换当前模型对象为数组 - * @access public - * @return array - */ - public function toArray() - { - $item = []; - - //过滤属性 - if (!empty($this->visible)) { - $data = array_intersect_key($this->data, array_flip($this->visible)); - } elseif (!empty($this->hidden)) { - $data = array_diff_key($this->data, array_flip($this->hidden)); - } else { - $data = $this->data; - } - - foreach ($data as $key => $val) { - if ($val instanceof Model || $val instanceof Collection) { - // 关联模型对象 - $item[$key] = $val->toArray(); - } elseif (is_array($val) && reset($val) instanceof Model) { - // 关联模型数据集 - $arr = []; - foreach ($val as $k => $value) { - $arr[$k] = $value->toArray(); - } - $item[$key] = $arr; - } else { - // 模型属性 - $item[$key] = $this->getAttr($key); - } - } - // 追加属性(必须定义获取器) - if (!empty($this->append)) { - foreach ($this->append as $name) { - $item[$name] = $this->getAttr($name); - } - } - return !empty($item) ? $item : []; - } - - /** - * 转换当前模型对象为JSON字符串 - * @access public - * @param integer $options json参数 - * @return string - */ - public function toJson($options = JSON_UNESCAPED_UNICODE) - { - return json_encode($this->toArray(), $options); - } - - /** - * 获取模型对象的主键 - * @access public - * @param string $name 模型名 - * @return mixed - */ - public function getPk($name = '') - { - if (!empty($name)) { - $table = $this->db()->getTable($name); - return $this->db()->getPk($table); - } elseif (empty($this->pk)) { - $this->pk = $this->db()->getPk(); - } - return $this->pk; - } - - /** - * 判断一个字段名是否为主键字段 - * @access public - * @param string $key 名称 - * @return bool - */ - protected function isPk($key) - { - $pk = $this->getPk(); - if (is_string($pk) && $pk == $key) { - return true; - } elseif (is_array($pk) && in_array($key, $pk)) { - return true; - } - return false; - } - - /** - * 保存当前数据对象 - * @access public - * @param array $data 数据 - * @param array $where 更新条件 - * @param string $sequence 自增序列名 - * @return integer|false - */ - public function save($data = [], $where = [], $sequence = null) - { - if (!empty($data)) { - // 数据自动验证 - if (!$this->validateData($data)) { - return false; - } - // 数据对象赋值 - foreach ($data as $key => $value) { - $this->setAttr($key, $value, $data); - } - if (!empty($where)) { - $this->isUpdate = true; - } - } - - // 检测字段 - if (!empty($this->field)) { - foreach ($this->data as $key => $val) { - if (!in_array($key, $this->field)) { - unset($this->data[$key]); - } - } - } - - // 数据自动完成 - $this->autoCompleteData($this->auto); - - // 自动写入更新时间 - if ($this->autoWriteTimestamp && $this->updateTime) { - $this->setAttr($this->updateTime, null); - } - - // 事件回调 - if (false === $this->trigger('before_write', $this)) { - return false; - } - $pk = $this->getPk(); - if ($this->isUpdate) { - // 自动更新 - $this->autoCompleteData($this->update); - - // 事件回调 - if (false === $this->trigger('before_update', $this)) { - return false; - } - - // 去除没有更新的字段 - $data = []; - foreach ($this->data as $key => $val) { - if (in_array($key, $this->change) || $this->isPk($key)) { - $data[$key] = $val; - } - } - - if (!empty($this->readonly)) { - // 只读字段不允许更新 - foreach ($this->readonly as $key => $field) { - if (isset($data[$field])) { - unset($data[$field]); - } - } - } - - if (empty($where) && !empty($this->updateWhere)) { - $where = $this->updateWhere; - } - - if (is_string($pk) && isset($data[$pk])) { - if (!isset($where[$pk])) { - unset($where); - $where[$pk] = $data[$pk]; - } - unset($data[$pk]); - } - - $result = $this->db()->where($where)->update($data); - // 清空change - $this->change = []; - // 更新回调 - $this->trigger('after_update', $this); - } else { - // 自动写入 - $this->autoCompleteData($this->insert); - - // 自动写入创建时间 - if ($this->autoWriteTimestamp && $this->createTime) { - $this->setAttr($this->createTime, null); - } - - if (false === $this->trigger('before_insert', $this)) { - return false; - } - - $result = $this->db()->insert($this->data); - - // 获取自动增长主键 - if ($result && is_string($pk) && !isset($this->data[$pk])) { - $insertId = $this->db()->getLastInsID($sequence); - if ($insertId) { - $this->data[$pk] = $insertId; - } - } - // 标记为更新 - $this->isUpdate = true; - // 清空change - $this->change = []; - // 新增回调 - $this->trigger('after_insert', $this); - } - // 写入回调 - $this->trigger('after_write', $this); - - return $result; - } - - /** - * 保存多个数据到当前数据对象 - * @access public - * @param array $dataSet 数据 - * @param boolean $replace 是否自动识别更新和写入 - * @return array|false - */ - public function saveAll($dataSet, $replace = true) - { - if ($this->validate) { - // 数据批量验证 - $validate = $this->validate; - foreach ($dataSet as $data) { - if (!$this->validateData($data, $validate)) { - return false; - } - } - } - - $result = []; - $db = $this->db(); - $db->startTrans(); - try { - $pk = $this->getPk(); - if (is_string($pk) && $replace) { - $auto = true; - } - foreach ($dataSet as $key => $data) { - if (!empty($auto) && isset($data[$pk])) { - $result[$key] = self::update($data); - } else { - $result[$key] = self::create($data); - } - } - $db->commit(); - return $result; - } catch (\Exception $e) { - $db->rollback(); - throw $e; - } - } - - /** - * 设置允许写入的字段 - * @access public - * @param bool|array $field 允许写入的字段 如果为true只允许写入数据表字段 - * @return $this - */ - public function allowField($field) - { - if (true === $field) { - $field = $this->db()->getTableInfo('', 'fields'); - } - $this->field = $field; - return $this; - } - - /** - * 是否为更新数据 - * @access public - * @param bool $update - * @param mixed $where - * @return $this - */ - public function isUpdate($update = true, $where = null) - { - $this->isUpdate = $update; - if (!empty($where)) { - $this->updateWhere = $where; - } - return $this; - } - - /** - * 数据自动完成 - * @access public - * @param array $auto 要自动更新的字段列表 - * @return void - */ - protected function autoCompleteData($auto = []) - { - foreach ($auto as $field => $value) { - if (is_integer($field)) { - $field = $value; - $value = null; - } - if (!in_array($field, $this->change)) { - $this->setAttr($field, !is_null($value) ? $value : (isset($this->data[$field]) ? $this->data[$field] : $value)); - } - } - } - - /** - * 删除当前的记录 - * @access public - * @return integer - */ - public function delete() - { - if (false === $this->trigger('before_delete', $this)) { - return false; - } - - $result = $this->db()->delete($this->data); - - $this->trigger('after_delete', $this); - return $result; - } - - /** - * 设置自动完成的字段( 规则通过修改器定义) - * @access public - * @param array $fields 需要自动完成的字段 - * @return $this - */ - public function auto($fields) - { - $this->auto = $fields; - return $this; - } - - /** - * 设置字段验证 - * @access public - * @param array|string|bool $rule 验证规则 true表示自动读取验证器类 - * @param array $msg 提示信息 - * @param bool $batch 批量验证 - * @return $this - */ - public function validate($rule = true, $msg = [], $batch = false) - { - if (is_array($rule)) { - $this->validate = [ - 'rule' => $rule, - 'msg' => $msg, - ]; - } else { - $this->validate = true === $rule ? $this->name : $rule; - } - $this->batchValidate = $batch; - return $this; - } - - /** - * 设置验证失败后是否抛出异常 - * @access public - * @param bool $fail 是否抛出异常 - * @return $this - */ - public function validateFailException($fail = true) - { - $this->failException = $fail; - return $this; - } - - /** - * 自动验证数据 - * @access protected - * @param array $data 验证数据 - * @param mixed $rule 验证规则 - * @param bool $batch 批量验证 - * @return bool - */ - protected function validateData($data, $rule = null, $batch = null) - { - $info = is_null($rule) ? $this->validate : $rule; - - if (!empty($info)) { - if (is_array($info)) { - $validate = Loader::validate(); - $validate->rule($info['rule']); - $validate->message($info['msg']); - } else { - $name = is_string($info) ? $info : $this->name; - if (strpos($name, '.')) { - list($name, $scene) = explode('.', $name); - } - $validate = Loader::validate($name); - if (!empty($scene)) { - $validate->scene($scene); - } - } - $batch = is_null($batch) ? $this->batchValidate : $batch; - - if (!$validate->batch($batch)->check($data)) { - $this->error = $validate->getError(); - if ($this->failException) { - throw new ValidateException($this->error); - } else { - return false; - } - } - $this->validate = null; - } - return true; - } - - /** - * 返回模型的错误信息 - * @access public - * @return string - */ - public function getError() - { - return $this->error; - } - - /** - * 注册回调方法 - * @access public - * @param string $event 事件名 - * @param callable $callback 回调方法 - * @param bool $override 是否覆盖 - * @return void - */ - public static function event($event, $callback, $override = false) - { - $class = get_called_class(); - if ($override) { - self::$event[$class][$event] = []; - } - self::$event[$class][$event][] = $callback; - } - - /** - * 触发事件 - * @access protected - * @param string $event 事件名 - * @param mixed $params 传入参数(引用) - * @return bool - */ - protected function trigger($event, &$params) - { - if (isset(self::$event[$this->class][$event])) { - foreach (self::$event[$this->class][$event] as $callback) { - if (is_callable($callback)) { - $result = call_user_func_array($callback, [ & $params]); - if (false === $result) { - return false; - } - } - } - } - return true; - } - - /** - * 写入数据 - * @access public - * @param array $data 数据数组 - * @return $this - */ - public static function create($data = []) - { - $model = new static(); - $model->isUpdate(false)->save($data, []); - return $model; - } - - /** - * 更新数据 - * @access public - * @param array $data 数据数组 - * @param array $where 更新条件 - * @return $this - */ - public static function update($data = [], $where = []) - { - $model = new static(); - $result = $model->isUpdate(true)->save($data, $where); - return $model; - } - - /** - * 查找单条记录 - * @access public - * @param mixed $data 主键值或者查询条件(闭包) - * @param array|string $with 关联预查询 - * @param bool $cache 是否缓存 - * @return static - * @throws exception\DbException - */ - public static function get($data = null, $with = [], $cache = false) - { - $query = static::parseQuery($data, $with, $cache); - return $query->find($data); - } - - /** - * 查找所有记录 - * @access public - * @param mixed $data 主键列表或者查询条件(闭包) - * @param array|string $with 关联预查询 - * @param bool $cache 是否缓存 - * @return static[]|false - * @throws exception\DbException - */ - public static function all($data = null, $with = [], $cache = false) - { - $query = static::parseQuery($data, $with, $cache); - return $query->select($data); - } - - /** - * 分析查询表达式 - * @access public - * @param mixed $data 主键列表或者查询条件(闭包) - * @param string $with 关联预查询 - * @param bool $cache 是否缓存 - * @return Query - */ - protected static function parseQuery(&$data, $with, $cache) - { - $result = self::with($with)->cache($cache); - if (is_array($data) && key($data) !== 0) { - $result = $result->where($data); - $data = null; - } elseif ($data instanceof \Closure) { - call_user_func_array($data, [ & $result]); - $data = null; - } elseif ($data instanceof Query) { - $result = $data->with($with)->cache($cache); - $data = null; - } - return $result; - } - - /** - * 删除记录 - * @access public - * @param mixed $data 主键列表 支持闭包查询条件 - * @return integer 成功删除的记录数 - */ - public static function destroy($data) - { - $model = new static(); - $query = $model->db(); - if (is_array($data) && key($data) !== 0) { - $query->where($data); - $data = null; - } elseif ($data instanceof \Closure) { - call_user_func_array($data, [ & $query]); - $data = null; - } elseif (is_null($data)) { - return 0; - } - $resultSet = $query->select($data); - $count = 0; - if ($resultSet) { - foreach ($resultSet as $data) { - $result = $data->delete(); - $count += $result; - } - } - return $count; - } - - /** - * 命名范围 - * @access public - * @param string|array|Closure $name 命名范围名称 逗号分隔 - * @param mixed ...$params 参数调用 - * @return Model - */ - public static function scope($name) - { - if ($name instanceof Query) { - return $name; - } - $model = new static(); - $params = func_get_args(); - $params[0] = $model->db(); - if ($name instanceof \Closure) { - call_user_func_array($name, $params); - } elseif (is_string($name)) { - $name = explode(',', $name); - } - if (is_array($name)) { - foreach ($name as $scope) { - $method = 'scope' . trim($scope); - if (method_exists($model, $method)) { - call_user_func_array([$model, $method], $params); - } - } - } - return $model; - } - - /** - * 设置是否使用全局查询范围 - * @param bool $use 是否启用全局查询范围 - * @access public - * @return Model - */ - public static function useGlobalScope($use) - { - $model = new static(); - $model->useGlobalScope = $use; - return $model; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $relation 关联方法名 - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @return Model - */ - public static function has($relation, $operator = '>=', $count = 1, $id = '*') - { - $model = new static(); - $info = $model->$relation()->getRelationInfo(); - $table = $info['model']::getTable(); - switch ($info['type']) { - case Relation::HAS_MANY: - return $model->db()->alias('a') - ->join($table . ' b', 'a.' . $info['localKey'] . '=b.' . $info['foreignKey'], $info['joinType']) - ->group('b.' . $info['foreignKey']) - ->having('count(' . $id . ')' . $operator . $count); - case Relation::HAS_MANY_THROUGH: // TODO - default: - return $model; - } - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $relation 关联方法名 - * @param mixed $where 查询条件(数组或者闭包) - * @return Model - */ - public static function hasWhere($relation, $where = []) - { - $model = new static(); - $info = $model->$relation()->getRelationInfo(); - switch ($info['type']) { - case Relation::HAS_ONE: - case Relation::HAS_MANY: - $table = $info['model']::getTable(); - if (is_array($where)) { - foreach ($where as $key => $val) { - if (false === strpos($key, '.')) { - $where['b.' . $key] = $val; - unset($where[$key]); - } - } - } - return $model->db()->alias('a') - ->field('a.*') - ->join($table . ' b', 'a.' . $info['localKey'] . '=b.' . $info['foreignKey'], $info['joinType']) - ->where($where); - case Relation::HAS_MANY_THROUGH: // TODO - default: - return $model; - } - } - - /** - * 解析模型的完整命名空间 - * @access public - * @param string $model 模型名(或者完整类名) - * @return string - */ - protected function parseModel($model) - { - if (false === strpos($model, '\\')) { - $path = explode('\\', get_called_class()); - array_pop($path); - array_push($path, Loader::parseName($model, 1)); - $model = implode('\\', $path); - } - return $model; - } - - /** - * 查询当前模型的关联数据 - * @access public - * @param string|array $relations 关联名 - * @return $this - */ - public function relationQuery($relations) - { - if (is_string($relations)) { - $relations = explode(',', $relations); - } - $this->relation(); - foreach ($relations as $relation) { - $this->data[$relation] = $this->relation->getRelation($relation); - } - return $this; - } - - /** - * 预载入关联查询 返回数据集 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 关联名 - * @return array - */ - public function eagerlyResultSet($resultSet, $relation) - { - return $this->relation()->eagerlyResultSet($resultSet, $relation); - } - - /** - * 预载入关联查询 返回模型对象 - * @access public - * @param Model $result 数据对象 - * @param string $relation 关联名 - * @return Model - */ - public function eagerlyResult($result, $relation) - { - return $this->relation()->eagerlyResult($result, $relation); - } - - /** - * HAS ONE 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 关联主键 - * @param array $alias 别名定义 - * @param string $joinType JOIN类型 - * @return Relation - */ - public function hasOne($model, $foreignKey = '', $localKey = '', $alias = [], $joinType = 'INNER') - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $localKey = $localKey ?: $this->getPk(); - $foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id'; - return $this->relation()->hasOne($model, $foreignKey, $localKey, $alias, $joinType); - } - - /** - * BELONGS TO 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $otherKey 关联主键 - * @param array $alias 别名定义 - * @param string $joinType JOIN类型 - * @return Relation - */ - public function belongsTo($model, $foreignKey = '', $otherKey = '', $alias = [], $joinType = 'INNER') - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $foreignKey = $foreignKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id'; - $otherKey = $otherKey ?: (new $model)->getPk(); - return $this->relation()->belongsTo($model, $foreignKey, $otherKey, $alias, $joinType); - } - - /** - * HAS MANY 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 关联主键 - * @param array $alias 别名定义 - * @return Relation - */ - public function hasMany($model, $foreignKey = '', $localKey = '', $alias = []) - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $localKey = $localKey ?: $this->getPk(); - $foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id'; - return $this->relation()->hasMany($model, $foreignKey, $localKey, $alias); - } - - /** - * HAS MANY 远程关联定义 - * @access public - * @param string $model 模型名 - * @param string $through 中间模型名 - * @param string $foreignKey 关联外键 - * @param string $throughKey 关联外键 - * @param string $localKey 关联主键 - * @param array $alias 别名定义 - * @return Relation - */ - public function hasManyThrough($model, $through, $foreignKey = '', $throughKey = '', $localKey = '', $alias = []) - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $through = $this->parseModel($through); - $localKey = $localKey ?: $this->getPk(); - $foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id'; - $name = Loader::parseName(basename(str_replace('\\', '/', $through))); - $throughKey = $throughKey ?: $name . '_id'; - return $this->relation()->hasManyThrough($model, $through, $foreignKey, $throughKey, $localKey, $alias); - } - - /** - * BELONGS TO MANY 关联定义 - * @access public - * @param string $model 模型名 - * @param string $table 中间表名 - * @param string $foreignKey 关联外键 - * @param string $localKey 当前模型关联键 - * @param array $alias 别名定义 - * @return Relation - */ - public function belongsToMany($model, $table = '', $foreignKey = '', $localKey = '', $alias = []) - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $name = Loader::parseName(basename(str_replace('\\', '/', $model))); - $table = $table ?: $this->db()->getTable(Loader::parseName($this->name) . '_' . $name); - $foreignKey = $foreignKey ?: $name . '_id'; - $localKey = $localKey ?: Loader::parseName($this->name) . '_id'; - return $this->relation()->belongsToMany($model, $table, $foreignKey, $localKey, $alias); - } - - public function __call($method, $args) - { - $query = $this->db(); - if (method_exists($this, 'scope' . $method)) { - // 动态调用命名范围 - $method = 'scope' . $method; - array_unshift($args, $query); - call_user_func_array([$this, $method], $args); - return $this; - } else { - return call_user_func_array([$query, $method], $args); - } - } - - public static function __callStatic($method, $params) - { - $query = (new static())->db(); - return call_user_func_array([$query, $method], $params); - } - - /** - * 修改器 设置数据对象的值 - * @access public - * @param string $name 名称 - * @param mixed $value 值 - * @return void - */ - public function __set($name, $value) - { - $this->setAttr($name, $value); - } - - /** - * 获取器 获取数据对象的值 - * @access public - * @param string $name 名称 - * @return mixed - */ - public function __get($name) - { - return $this->getAttr($name); - } - - /** - * 检测数据对象的值 - * @access public - * @param string $name 名称 - * @return boolean - */ - public function __isset($name) - { - try { - if (array_key_exists($name, $this->data)) { - return true; - } else { - $this->getAttr($name); - return true; - } - } catch (InvalidArgumentException $e) { - return false; - } - - } - - /** - * 销毁数据对象的值 - * @access public - * @param string $name 名称 - * @return void - */ - public function __unset($name) - { - unset($this->data[$name]); - } - - public function __toString() - { - return $this->toJson(); - } - - // JsonSerializable - public function jsonSerialize() - { - return $this->toArray(); - } - - // ArrayAccess - public function offsetSet($name, $value) - { - $this->setAttr($name, $value); - } - - public function offsetExists($name) - { - return $this->__isset($name); - } - - public function offsetUnset($name) - { - $this->__unset($name); - } - - public function offsetGet($name) - { - return $this->getAttr($name); - } - - /** - * 解序列化后处理 - */ - public function __wakeup() - { - $this->initialize(); - } - -} diff --git a/thinkphp/library/think/Paginator.php b/thinkphp/library/think/Paginator.php deleted file mode 100755 index 7385ebb..0000000 --- a/thinkphp/library/think/Paginator.php +++ /dev/null @@ -1,258 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: zhangyajun <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\paginator\Collection as PaginatorCollection; -use think\Request; - -abstract class Paginator -{ - /** @var bool 是否为简洁模式 */ - protected $simple = false; - - /** @var PaginatorCollection 数据集 */ - protected $items; - - /** @var integer 当前页 */ - protected $currentPage; - - /** @var integer 最后一页 */ - protected $lastPage; - - /** @var integer|null 数据总数 */ - protected $total; - - /** @var integer 每页的数量 */ - protected $listRows; - - /** @var bool 是否有下一页 */ - protected $hasMore; - - /** @var array 一些配置 */ - protected $options = [ - 'var_page' => 'page', - 'path' => '/', - 'query' => [], - 'fragment' => '' - ]; - - protected function __construct($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = []) - { - $this->options = array_merge($this->options, $options); - - $this->options['path'] = $this->options['path'] != '/' ? rtrim($this->options['path'], '/') : $this->options['path']; - - $this->simple = $simple; - $this->listRows = $listRows; - - if ($simple) { - if (!$items instanceof Collection) { - $items = Collection::make($items); - } - $this->currentPage = $this->setCurrentPage($currentPage); - $this->hasMore = count($items) > ($this->listRows); - $items = $items->slice(0, $this->listRows); - } else { - $this->total = $total; - $this->lastPage = (int)ceil($total / $listRows); - $this->currentPage = $this->setCurrentPage($currentPage); - $this->hasMore = $this->currentPage < $this->lastPage; - } - - $this->items = PaginatorCollection::make($items, $this); - } - - /** - * @param $items - * @param $listRows - * @param null $currentPage - * @param bool $simple - * @param null $total - * @param array $options - * @return PaginatorCollection - */ - public static function make($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = []) - { - $paginator = new static($items, $listRows, $currentPage, $total, $simple, $options); - return $paginator->items; - } - - protected function setCurrentPage($currentPage) - { - if (!$this->simple && $currentPage > $this->lastPage) { - return $this->lastPage > 0 ? $this->lastPage : 1; - } - - return $currentPage; - } - - /** - * 获取页码对应的链接 - * - * @param $page - * @return string - */ - protected function url($page) - { - if ($page <= 0) { - $page = 1; - } - - if (strpos($this->options['path'], '[PAGE]') === false) { - $parameters = [$this->options['var_page'] => $page]; - $path = $this->options['path']; - } else { - $parameters = []; - $path = str_replace('[PAGE]', $page, $this->options['path']); - } - if (count($this->options['query']) > 0) { - $parameters = array_merge($this->options['query'], $parameters); - } - $url = $path; - if (!empty($parameters)) { - $url .= '?' . urldecode(http_build_query($parameters, null, '&')); - } - return $url . $this->buildFragment(); - } - - /** - * 自动获取当前页码 - * @param string $varPage - * @param int $default - * @return int - */ - public static function getCurrentPage($varPage = 'page', $default = 1) - { - $page = Request::instance()->request($varPage); - - if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int)$page >= 1) { - return $page; - } - - return $default; - } - - /** - * 自动获取当前的path - * @return string - */ - public static function getCurrentPath() - { - return Request::instance()->baseUrl(); - } - - public function total() - { - if ($this->simple) { - throw new \DomainException('not support total'); - } - return $this->total; - } - - public function listRows() - { - return $this->listRows; - } - - public function currentPage() - { - return $this->currentPage; - } - - public function lastPage() - { - if ($this->simple) { - throw new \DomainException('not support last'); - } - return $this->lastPage; - } - - /** - * 数据是否足够分页 - * @return boolean - */ - public function hasPages() - { - return !($this->currentPage == 1 && !$this->hasMore); - } - - /** - * 创建一组分页链接 - * - * @param int $start - * @param int $end - * @return array - */ - public function getUrlRange($start, $end) - { - $urls = []; - - for ($page = $start; $page <= $end; $page++) { - $urls[$page] = $this->url($page); - } - - return $urls; - } - - /** - * 设置URL锚点 - * - * @param string|null $fragment - * @return $this - */ - public function fragment($fragment) - { - $this->options['fragment'] = $fragment; - return $this; - } - - /** - * 添加URL参数 - * - * @param array|string $key - * @param string|null $value - * @return $this - */ - public function appends($key, $value = null) - { - if (!is_array($key)) { - $queries = [$key => $value]; - } else { - $queries = $key; - } - - foreach ($queries as $k => $v) { - if ($k !== $this->options['var_page']) { - $this->options['query'][$k] = $v; - } - } - - return $this; - } - - - /** - * 构造锚点字符串 - * - * @return string - */ - protected function buildFragment() - { - return $this->options['fragment'] ? '#' . $this->options['fragment'] : ''; - } - - /** - * 渲染分页html - * @return mixed - */ - abstract public function render(); -} \ No newline at end of file diff --git a/thinkphp/library/think/Process.php b/thinkphp/library/think/Process.php deleted file mode 100755 index 1982de2..0000000 --- a/thinkphp/library/think/Process.php +++ /dev/null @@ -1,1205 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\process\exception\Failed as ProcessFailedException; -use think\process\exception\Timeout as ProcessTimeoutException; -use think\process\pipes\Pipes; -use think\process\Utils; -use think\process\pipes\Unix as UnixPipes; -use think\process\pipes\Windows as WindowsPipes; - -class Process -{ - - const ERR = 'err'; - const OUT = 'out'; - - const STATUS_READY = 'ready'; - const STATUS_STARTED = 'started'; - const STATUS_TERMINATED = 'terminated'; - - const STDIN = 0; - const STDOUT = 1; - const STDERR = 2; - - const TIMEOUT_PRECISION = 0.2; - - private $callback; - private $commandline; - private $cwd; - private $env; - private $input; - private $starttime; - private $lastOutputTime; - private $timeout; - private $idleTimeout; - private $options; - private $exitcode; - private $fallbackExitcode; - private $processInformation; - private $outputDisabled = false; - private $stdout; - private $stderr; - private $enhanceWindowsCompatibility = true; - private $enhanceSigchildCompatibility; - private $process; - private $status = self::STATUS_READY; - private $incrementalOutputOffset = 0; - private $incrementalErrorOutputOffset = 0; - private $tty; - private $pty; - - private $useFileHandles = false; - - /** @var Pipes */ - private $processPipes; - - private $latestSignal; - - private static $sigchild; - - /** - * @var array - */ - public static $exitCodes = [ - 0 => 'OK', - 1 => 'General error', - 2 => 'Misuse of shell builtins', - 126 => 'Invoked command cannot execute', - 127 => 'Command not found', - 128 => 'Invalid exit argument', - // signals - 129 => 'Hangup', - 130 => 'Interrupt', - 131 => 'Quit and dump core', - 132 => 'Illegal instruction', - 133 => 'Trace/breakpoint trap', - 134 => 'Process aborted', - 135 => 'Bus error: "access to undefined portion of memory object"', - 136 => 'Floating point exception: "erroneous arithmetic operation"', - 137 => 'Kill (terminate immediately)', - 138 => 'User-defined 1', - 139 => 'Segmentation violation', - 140 => 'User-defined 2', - 141 => 'Write to pipe with no one reading', - 142 => 'Signal raised by alarm', - 143 => 'Termination (request to terminate)', - // 144 - not defined - 145 => 'Child process terminated, stopped (or continued*)', - 146 => 'Continue if stopped', - 147 => 'Stop executing temporarily', - 148 => 'Terminal stop signal', - 149 => 'Background process attempting to read from tty ("in")', - 150 => 'Background process attempting to write to tty ("out")', - 151 => 'Urgent data available on socket', - 152 => 'CPU time limit exceeded', - 153 => 'File size limit exceeded', - 154 => 'Signal raised by timer counting virtual time: "virtual timer expired"', - 155 => 'Profiling timer expired', - // 156 - not defined - 157 => 'Pollable event', - // 158 - not defined - 159 => 'Bad syscall', - ]; - - /** - * 构造方法 - * @param string $commandline 指令 - * @param string|null $cwd 工作目录 - * @param array|null $env 环境变量 - * @param string|null $input 输入 - * @param int|float|null $timeout 超时时间 - * @param array $options proc_open的选项 - * @throws \RuntimeException - * @api - */ - public function __construct($commandline, $cwd = null, array $env = null, $input = null, $timeout = 60, array $options = []) - { - if (!function_exists('proc_open')) { - throw new \RuntimeException('The Process class relies on proc_open, which is not available on your PHP installation.'); - } - - $this->commandline = $commandline; - $this->cwd = $cwd; - - if (null === $this->cwd && (defined('ZEND_THREAD_SAFE') || '\\' === DS)) { - $this->cwd = getcwd(); - } - if (null !== $env) { - $this->setEnv($env); - } - - $this->input = $input; - $this->setTimeout($timeout); - $this->useFileHandles = '\\' === DS; - $this->pty = false; - $this->enhanceWindowsCompatibility = true; - $this->enhanceSigchildCompatibility = '\\' !== DS && $this->isSigchildEnabled(); - $this->options = array_replace([ - 'suppress_errors' => true, - 'binary_pipes' => true - ], $options); - } - - public function __destruct() - { - $this->stop(); - } - - public function __clone() - { - $this->resetProcessData(); - } - - /** - * 运行指令 - * @param callback|null $callback - * @return int - */ - public function run($callback = null) - { - $this->start($callback); - - return $this->wait(); - } - - /** - * 运行指令 - * @param callable|null $callback - * @return self - * @throws \RuntimeException - * @throws ProcessFailedException - */ - public function mustRun($callback = null) - { - if ($this->isSigchildEnabled() && !$this->enhanceSigchildCompatibility) { - throw new \RuntimeException('This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.'); - } - - if (0 !== $this->run($callback)) { - throw new ProcessFailedException($this); - } - - return $this; - } - - /** - * 启动进程并写到 STDIN 输入后返回。 - * @param callable|null $callback - * @throws \RuntimeException - * @throws \RuntimeException - * @throws \LogicException - */ - public function start($callback = null) - { - if ($this->isRunning()) { - throw new \RuntimeException('Process is already running'); - } - if ($this->outputDisabled && null !== $callback) { - throw new \LogicException('Output has been disabled, enable it to allow the use of a callback.'); - } - - $this->resetProcessData(); - $this->starttime = $this->lastOutputTime = microtime(true); - $this->callback = $this->buildCallback($callback); - $descriptors = $this->getDescriptors(); - - $commandline = $this->commandline; - - if ('\\' === DS && $this->enhanceWindowsCompatibility) { - $commandline = 'cmd /V:ON /E:ON /C "(' . $commandline . ')'; - foreach ($this->processPipes->getFiles() as $offset => $filename) { - $commandline .= ' ' . $offset . '>' . Utils::escapeArgument($filename); - } - $commandline .= '"'; - - if (!isset($this->options['bypass_shell'])) { - $this->options['bypass_shell'] = true; - } - } - - $this->process = proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $this->env, $this->options); - - if (!is_resource($this->process)) { - throw new \RuntimeException('Unable to launch a new process.'); - } - $this->status = self::STATUS_STARTED; - - if ($this->tty) { - return; - } - - $this->updateStatus(false); - $this->checkTimeout(); - } - - /** - * 重启进程 - * @param callable|null $callback - * @return Process - * @throws \RuntimeException - * @throws \RuntimeException - */ - public function restart($callback = null) - { - if ($this->isRunning()) { - throw new \RuntimeException('Process is already running'); - } - - $process = clone $this; - $process->start($callback); - - return $process; - } - - /** - * 等待要终止的进程 - * @param callable|null $callback - * @return int - */ - public function wait($callback = null) - { - $this->requireProcessIsStarted(__FUNCTION__); - - $this->updateStatus(false); - if (null !== $callback) { - $this->callback = $this->buildCallback($callback); - } - - do { - $this->checkTimeout(); - $running = '\\' === DS ? $this->isRunning() : $this->processPipes->areOpen(); - $close = '\\' !== DS || !$running; - $this->readPipes(true, $close); - } while ($running); - - while ($this->isRunning()) { - usleep(1000); - } - - if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) { - throw new \RuntimeException(sprintf('The process has been signaled with signal "%s".', $this->processInformation['termsig'])); - } - - return $this->exitcode; - } - - /** - * 获取PID - * @return int|null - * @throws \RuntimeException - */ - public function getPid() - { - if ($this->isSigchildEnabled()) { - throw new \RuntimeException('This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.'); - } - - $this->updateStatus(false); - - return $this->isRunning() ? $this->processInformation['pid'] : null; - } - - /** - * 将一个 POSIX 信号发送到进程中 - * @param int $signal - * @return Process - */ - public function signal($signal) - { - $this->doSignal($signal, true); - - return $this; - } - - /** - * 禁用从底层过程获取输出和错误输出。 - * @return Process - */ - public function disableOutput() - { - if ($this->isRunning()) { - throw new \RuntimeException('Disabling output while the process is running is not possible.'); - } - if (null !== $this->idleTimeout) { - throw new \LogicException('Output can not be disabled while an idle timeout is set.'); - } - - $this->outputDisabled = true; - - return $this; - } - - /** - * 开启从底层过程获取输出和错误输出。 - * @return Process - * @throws \RuntimeException - */ - public function enableOutput() - { - if ($this->isRunning()) { - throw new \RuntimeException('Enabling output while the process is running is not possible.'); - } - - $this->outputDisabled = false; - - return $this; - } - - /** - * 输出是否禁用 - * @return bool - */ - public function isOutputDisabled() - { - return $this->outputDisabled; - } - - /** - * 获取当前的输出管道 - * @return string - * @throws \LogicException - * @throws \LogicException - * @api - */ - public function getOutput() - { - if ($this->outputDisabled) { - throw new \LogicException('Output has been disabled.'); - } - - $this->requireProcessIsStarted(__FUNCTION__); - - $this->readPipes(false, '\\' === DS ? !$this->processInformation['running'] : true); - - return $this->stdout; - } - - /** - * 以增量方式返回的输出结果。 - * @return string - */ - public function getIncrementalOutput() - { - $this->requireProcessIsStarted(__FUNCTION__); - - $data = $this->getOutput(); - - $latest = substr($data, $this->incrementalOutputOffset); - - if (false === $latest) { - return ''; - } - - $this->incrementalOutputOffset = strlen($data); - - return $latest; - } - - /** - * 清空输出 - * @return Process - */ - public function clearOutput() - { - $this->stdout = ''; - $this->incrementalOutputOffset = 0; - - return $this; - } - - /** - * 返回当前的错误输出的过程 (STDERR)。 - * @return string - */ - public function getErrorOutput() - { - if ($this->outputDisabled) { - throw new \LogicException('Output has been disabled.'); - } - - $this->requireProcessIsStarted(__FUNCTION__); - - $this->readPipes(false, '\\' === DS ? !$this->processInformation['running'] : true); - - return $this->stderr; - } - - /** - * 以增量方式返回 errorOutput - * @return string - */ - public function getIncrementalErrorOutput() - { - $this->requireProcessIsStarted(__FUNCTION__); - - $data = $this->getErrorOutput(); - - $latest = substr($data, $this->incrementalErrorOutputOffset); - - if (false === $latest) { - return ''; - } - - $this->incrementalErrorOutputOffset = strlen($data); - - return $latest; - } - - /** - * 清空 errorOutput - * @return Process - */ - public function clearErrorOutput() - { - $this->stderr = ''; - $this->incrementalErrorOutputOffset = 0; - - return $this; - } - - /** - * 获取退出码 - * @return null|int - */ - public function getExitCode() - { - if ($this->isSigchildEnabled() && !$this->enhanceSigchildCompatibility) { - throw new \RuntimeException('This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.'); - } - - $this->updateStatus(false); - - return $this->exitcode; - } - - /** - * 获取退出文本 - * @return null|string - */ - public function getExitCodeText() - { - if (null === $exitcode = $this->getExitCode()) { - return null; - } - - return isset(self::$exitCodes[$exitcode]) ? self::$exitCodes[$exitcode] : 'Unknown error'; - } - - /** - * 检查是否成功 - * @return bool - */ - public function isSuccessful() - { - return 0 === $this->getExitCode(); - } - - /** - * 是否未捕获的信号已被终止子进程 - * @return bool - */ - public function hasBeenSignaled() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - if ($this->isSigchildEnabled()) { - throw new \RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.'); - } - - $this->updateStatus(false); - - return $this->processInformation['signaled']; - } - - /** - * 返回导致子进程终止其执行的数。 - * @return int - */ - public function getTermSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - if ($this->isSigchildEnabled()) { - throw new \RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.'); - } - - $this->updateStatus(false); - - return $this->processInformation['termsig']; - } - - /** - * 检查子进程信号是否已停止 - * @return bool - */ - public function hasBeenStopped() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - $this->updateStatus(false); - - return $this->processInformation['stopped']; - } - - /** - * 返回导致子进程停止其执行的数。 - * @return int - */ - public function getStopSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - - $this->updateStatus(false); - - return $this->processInformation['stopsig']; - } - - /** - * 检查是否正在运行 - * @return bool - */ - public function isRunning() - { - if (self::STATUS_STARTED !== $this->status) { - return false; - } - - $this->updateStatus(false); - - return $this->processInformation['running']; - } - - /** - * 检查是否已开始 - * @return bool - */ - public function isStarted() - { - return $this->status != self::STATUS_READY; - } - - /** - * 检查是否已终止 - * @return bool - */ - public function isTerminated() - { - $this->updateStatus(false); - - return $this->status == self::STATUS_TERMINATED; - } - - /** - * 获取当前的状态 - * @return string - */ - public function getStatus() - { - $this->updateStatus(false); - - return $this->status; - } - - /** - * 终止进程 - */ - public function stop() - { - if ($this->isRunning()) { - if ('\\' === DS && !$this->isSigchildEnabled()) { - exec(sprintf('taskkill /F /T /PID %d 2>&1', $this->getPid()), $output, $exitCode); - if ($exitCode > 0) { - throw new \RuntimeException('Unable to kill the process'); - } - } else { - $pids = preg_split('/\s+/', `ps -o pid --no-heading --ppid {$this->getPid()}`); - foreach ($pids as $pid) { - if (is_numeric($pid)) { - posix_kill($pid, 9); - } - } - } - } - - $this->updateStatus(false); - if ($this->processInformation['running']) { - $this->close(); - } - - return $this->exitcode; - } - - /** - * 添加一行输出 - * @param string $line - */ - public function addOutput($line) - { - $this->lastOutputTime = microtime(true); - $this->stdout .= $line; - } - - /** - * 添加一行错误输出 - * @param string $line - */ - public function addErrorOutput($line) - { - $this->lastOutputTime = microtime(true); - $this->stderr .= $line; - } - - /** - * 获取被执行的指令 - * @return string - */ - public function getCommandLine() - { - return $this->commandline; - } - - /** - * 设置指令 - * @param string $commandline - * @return self - */ - public function setCommandLine($commandline) - { - $this->commandline = $commandline; - - return $this; - } - - /** - * 获取超时时间 - * @return float|null - */ - public function getTimeout() - { - return $this->timeout; - } - - /** - * 获取idle超时时间 - * @return float|null - */ - public function getIdleTimeout() - { - return $this->idleTimeout; - } - - /** - * 设置超时时间 - * @param int|float|null $timeout - * @return self - */ - public function setTimeout($timeout) - { - $this->timeout = $this->validateTimeout($timeout); - - return $this; - } - - /** - * 设置idle超时时间 - * @param int|float|null $timeout - * @return self - */ - public function setIdleTimeout($timeout) - { - if (null !== $timeout && $this->outputDisabled) { - throw new \LogicException('Idle timeout can not be set while the output is disabled.'); - } - - $this->idleTimeout = $this->validateTimeout($timeout); - - return $this; - } - - /** - * 设置TTY - * @param bool $tty - * @return self - */ - public function setTty($tty) - { - if ('\\' === DS && $tty) { - throw new \RuntimeException('TTY mode is not supported on Windows platform.'); - } - if ($tty && (!file_exists('/dev/tty') || !is_readable('/dev/tty'))) { - throw new \RuntimeException('TTY mode requires /dev/tty to be readable.'); - } - - $this->tty = (bool)$tty; - - return $this; - } - - /** - * 检查是否是tty模式 - * @return bool - */ - public function isTty() - { - return $this->tty; - } - - /** - * 设置pty模式 - * @param bool $bool - * @return self - */ - public function setPty($bool) - { - $this->pty = (bool)$bool; - - return $this; - } - - /** - * 是否是pty模式 - * @return bool - */ - public function isPty() - { - return $this->pty; - } - - /** - * 获取工作目录 - * @return string|null - */ - public function getWorkingDirectory() - { - if (null === $this->cwd) { - return getcwd() ?: null; - } - - return $this->cwd; - } - - /** - * 设置工作目录 - * @param string $cwd - * @return self - */ - public function setWorkingDirectory($cwd) - { - $this->cwd = $cwd; - - return $this; - } - - /** - * 获取环境变量 - * @return array - */ - public function getEnv() - { - return $this->env; - } - - /** - * 设置环境变量 - * @param array $env - * @return self - */ - public function setEnv(array $env) - { - $env = array_filter($env, function ($value) { - return !is_array($value); - }); - - $this->env = []; - foreach ($env as $key => $value) { - $this->env[(binary)$key] = (binary)$value; - } - - return $this; - } - - /** - * 获取输入 - * @return null|string - */ - public function getInput() - { - return $this->input; - } - - /** - * 设置输入 - * @param mixed $input - * @return self - */ - public function setInput($input) - { - if ($this->isRunning()) { - throw new \LogicException('Input can not be set while the process is running.'); - } - - $this->input = Utils::validateInput(sprintf('%s::%s', __CLASS__, __FUNCTION__), $input); - - return $this; - } - - /** - * 获取proc_open的选项 - * @return array - */ - public function getOptions() - { - return $this->options; - } - - /** - * 设置proc_open的选项 - * @param array $options - * @return self - */ - public function setOptions(array $options) - { - $this->options = $options; - - return $this; - } - - /** - * 是否兼容windows - * @return bool - */ - public function getEnhanceWindowsCompatibility() - { - return $this->enhanceWindowsCompatibility; - } - - /** - * 设置是否兼容windows - * @param bool $enhance - * @return self - */ - public function setEnhanceWindowsCompatibility($enhance) - { - $this->enhanceWindowsCompatibility = (bool)$enhance; - - return $this; - } - - /** - * 返回是否 sigchild 兼容模式激活 - * @return bool - */ - public function getEnhanceSigchildCompatibility() - { - return $this->enhanceSigchildCompatibility; - } - - /** - * 激活 sigchild 兼容性模式。 - * @param bool $enhance - * @return self - */ - public function setEnhanceSigchildCompatibility($enhance) - { - $this->enhanceSigchildCompatibility = (bool)$enhance; - - return $this; - } - - /** - * 是否超时 - */ - public function checkTimeout() - { - if ($this->status !== self::STATUS_STARTED) { - return; - } - - if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) { - $this->stop(); - - throw new ProcessTimeoutException($this, ProcessTimeoutException::TYPE_GENERAL); - } - - if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) { - $this->stop(); - - throw new ProcessTimeoutException($this, ProcessTimeoutException::TYPE_IDLE); - } - } - - /** - * 是否支持pty - * @return bool - */ - public static function isPtySupported() - { - static $result; - - if (null !== $result) { - return $result; - } - - if ('\\' === DS) { - return $result = false; - } - - $proc = @proc_open('echo 1', [['pty'], ['pty'], ['pty']], $pipes); - if (is_resource($proc)) { - proc_close($proc); - - return $result = true; - } - - return $result = false; - } - - /** - * 创建所需的 proc_open 的描述符 - * @return array - */ - private function getDescriptors() - { - if ('\\' === DS) { - $this->processPipes = WindowsPipes::create($this, $this->input); - } else { - $this->processPipes = UnixPipes::create($this, $this->input); - } - $descriptors = $this->processPipes->getDescriptors($this->outputDisabled); - - if (!$this->useFileHandles && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) { - - $descriptors = array_merge($descriptors, [['pipe', 'w']]); - - $this->commandline = '(' . $this->commandline . ') 3>/dev/null; code=$?; echo $code >&3; exit $code'; - } - - return $descriptors; - } - - /** - * 建立 wait () 使用的回调。 - * @param callable|null $callback - * @return callable - */ - protected function buildCallback($callback) - { - $out = self::OUT; - $callback = function ($type, $data) use ($callback, $out) { - if ($out == $type) { - $this->addOutput($data); - } else { - $this->addErrorOutput($data); - } - - if (null !== $callback) { - call_user_func($callback, $type, $data); - } - }; - - return $callback; - } - - /** - * 更新状态 - * @param bool $blocking - */ - protected function updateStatus($blocking) - { - if (self::STATUS_STARTED !== $this->status) { - return; - } - - $this->processInformation = proc_get_status($this->process); - $this->captureExitCode(); - - $this->readPipes($blocking, '\\' === DS ? !$this->processInformation['running'] : true); - - if (!$this->processInformation['running']) { - $this->close(); - } - } - - /** - * 是否开启 '--enable-sigchild' - * @return bool - */ - protected function isSigchildEnabled() - { - if (null !== self::$sigchild) { - return self::$sigchild; - } - - if (!function_exists('phpinfo')) { - return self::$sigchild = false; - } - - ob_start(); - phpinfo(INFO_GENERAL); - - return self::$sigchild = false !== strpos(ob_get_clean(), '--enable-sigchild'); - } - - /** - * 验证是否超时 - * @param int|float|null $timeout - * @return float|null - */ - private function validateTimeout($timeout) - { - $timeout = (float)$timeout; - - if (0.0 === $timeout) { - $timeout = null; - } elseif ($timeout < 0) { - throw new \InvalidArgumentException('The timeout value must be a valid positive integer or float number.'); - } - - return $timeout; - } - - /** - * 读取pipes - * @param bool $blocking - * @param bool $close - */ - private function readPipes($blocking, $close) - { - $result = $this->processPipes->readAndWrite($blocking, $close); - - $callback = $this->callback; - foreach ($result as $type => $data) { - if (3 == $type) { - $this->fallbackExitcode = (int)$data; - } else { - $callback($type === self::STDOUT ? self::OUT : self::ERR, $data); - } - } - } - - /** - * 捕获退出码 - */ - private function captureExitCode() - { - if (isset($this->processInformation['exitcode']) && -1 != $this->processInformation['exitcode']) { - $this->exitcode = $this->processInformation['exitcode']; - } - } - - /** - * 关闭资源 - * @return int 退出码 - */ - private function close() - { - $this->processPipes->close(); - if (is_resource($this->process)) { - $exitcode = proc_close($this->process); - } else { - $exitcode = -1; - } - - $this->exitcode = -1 !== $exitcode ? $exitcode : (null !== $this->exitcode ? $this->exitcode : -1); - $this->status = self::STATUS_TERMINATED; - - if (-1 === $this->exitcode && null !== $this->fallbackExitcode) { - $this->exitcode = $this->fallbackExitcode; - } elseif (-1 === $this->exitcode && $this->processInformation['signaled'] - && 0 < $this->processInformation['termsig'] - ) { - $this->exitcode = 128 + $this->processInformation['termsig']; - } - - return $this->exitcode; - } - - /** - * 重置数据 - */ - private function resetProcessData() - { - $this->starttime = null; - $this->callback = null; - $this->exitcode = null; - $this->fallbackExitcode = null; - $this->processInformation = null; - $this->stdout = null; - $this->stderr = null; - $this->process = null; - $this->latestSignal = null; - $this->status = self::STATUS_READY; - $this->incrementalOutputOffset = 0; - $this->incrementalErrorOutputOffset = 0; - } - - /** - * 将一个 POSIX 信号发送到进程中。 - * @param int $signal - * @param bool $throwException - * @return bool - */ - private function doSignal($signal, $throwException) - { - if (!$this->isRunning()) { - if ($throwException) { - throw new \LogicException('Can not send signal on a non running process.'); - } - - return false; - } - - if ($this->isSigchildEnabled()) { - if ($throwException) { - throw new \RuntimeException('This PHP has been compiled with --enable-sigchild. The process can not be signaled.'); - } - - return false; - } - - if (true !== @proc_terminate($this->process, $signal)) { - if ($throwException) { - throw new \RuntimeException(sprintf('Error while sending signal `%s`.', $signal)); - } - - return false; - } - - $this->latestSignal = $signal; - - return true; - } - - /** - * 确保进程已经开启 - * @param string $functionName - */ - private function requireProcessIsStarted($functionName) - { - if (!$this->isStarted()) { - throw new \LogicException(sprintf('Process must be started before calling %s.', $functionName)); - } - } - - /** - * 确保进程已经终止 - * @param string $functionName - */ - private function requireProcessIsTerminated($functionName) - { - if (!$this->isTerminated()) { - throw new \LogicException(sprintf('Process must be terminated before calling %s.', $functionName)); - } - } -} \ No newline at end of file diff --git a/thinkphp/library/think/Request.php b/thinkphp/library/think/Request.php deleted file mode 100755 index 45b6542..0000000 --- a/thinkphp/library/think/Request.php +++ /dev/null @@ -1,1581 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\Config; -use think\Exception; -use think\File; -use think\Session; - -class Request -{ - /** - * @var object 对象实例 - */ - protected static $instance; - - protected $method; - /** - * @var string 域名 - */ - protected $domain; - - /** - * @var string URL地址 - */ - protected $url; - - /** - * @var string 基础URL - */ - protected $baseUrl; - - /** - * @var string 当前执行的文件 - */ - protected $baseFile; - - /** - * @var string 访问的ROOT地址 - */ - protected $root; - - /** - * @var string pathinfo - */ - protected $pathinfo; - - /** - * @var string pathinfo(不含后缀) - */ - protected $path; - - /** - * @var array 当前路由信息 - */ - protected $routeInfo = []; - - /** - * @var array 当前调度信息 - */ - protected $dispatch = []; - protected $module; - protected $controller; - protected $action; - // 当前语言集 - protected $langset; - - /** - * @var array 请求参数 - */ - protected $param = []; - protected $get = []; - protected $post = []; - protected $request = []; - protected $route = []; - protected $put; - protected $session = []; - protected $file = []; - protected $cookie = []; - protected $server = []; - protected $header = []; - - /** - * @var array 资源类型 - */ - protected $mimeType = [ - 'xml' => 'application/xml,text/xml,application/x-xml', - 'json' => 'application/json,text/x-json,application/jsonrequest,text/json', - 'js' => 'text/javascript,application/javascript,application/x-javascript', - 'css' => 'text/css', - 'rss' => 'application/rss+xml', - 'yaml' => 'application/x-yaml,text/yaml', - 'atom' => 'application/atom+xml', - 'pdf' => 'application/pdf', - 'text' => 'text/plain', - 'png' => 'image/png', - 'jpg' => 'image/jpg,image/jpeg,image/pjpeg', - 'gif' => 'image/gif', - 'csv' => 'text/csv', - 'html' => 'text/html,application/xhtml+xml,*/*', - ]; - - protected $content; - - // 全局过滤规则 - protected $filter; - // Hook扩展方法 - protected static $hook = []; - // 绑定的属性 - protected $bind = []; - // php://input - protected $input; - // 请求缓存 - protected $cache; - // 缓存是否检查 - protected $isCheckCache; - - /** - * 架构函数 - * @access protected - * @param array $options 参数 - */ - protected function __construct($options = []) - { - foreach ($options as $name => $item) { - if (property_exists($this, $name)) { - $this->$name = $item; - } - } - if (is_null($this->filter)) { - $this->filter = Config::get('default_filter'); - } - // 保存 php://input - $this->input = file_get_contents('php://input'); - } - - public function __call($method, $args) - { - if (array_key_exists($method, self::$hook)) { - array_unshift($args, $this); - return call_user_func_array(self::$hook[$method], $args); - } else { - throw new Exception('method not exists:' . __CLASS__ . '->' . $method); - } - } - - /** - * Hook 方法注入 - * @access public - * @param string|array $method 方法名 - * @param mixed $callback callable - * @return void - */ - public static function hook($method, $callback = null) - { - if (is_array($method)) { - self::$hook = array_merge(self::$hook, $method); - } else { - self::$hook[$method] = $callback; - } - } - - /** - * 初始化 - * @access public - * @param array $options 参数 - * @return \think\Request - */ - public static function instance($options = []) - { - if (is_null(self::$instance)) { - self::$instance = new static($options); - } - return self::$instance; - } - - /** - * 创建一个URL请求 - * @access public - * @param string $uri URL地址 - * @param string $method 请求类型 - * @param array $params 请求参数 - * @param array $cookie - * @param array $files - * @param array $server - * @param string $content - * @return \think\Request - */ - public static function create($uri, $method = 'GET', $params = [], $cookie = [], $files = [], $server = [], $content = null) - { - $server['PATH_INFO'] = ''; - $server['REQUEST_METHOD'] = strtoupper($method); - $info = parse_url($uri); - if (isset($info['host'])) { - $server['SERVER_NAME'] = $info['host']; - $server['HTTP_HOST'] = $info['host']; - } - if (isset($info['scheme'])) { - if ('https' === $info['scheme']) { - $server['HTTPS'] = 'on'; - $server['SERVER_PORT'] = 443; - } else { - unset($server['HTTPS']); - $server['SERVER_PORT'] = 80; - } - } - if (isset($info['port'])) { - $server['SERVER_PORT'] = $info['port']; - $server['HTTP_HOST'] = $server['HTTP_HOST'] . ':' . $info['port']; - } - if (isset($info['user'])) { - $server['PHP_AUTH_USER'] = $info['user']; - } - if (isset($info['pass'])) { - $server['PHP_AUTH_PW'] = $info['pass']; - } - if (!isset($info['path'])) { - $info['path'] = '/'; - } - $options = []; - $queryString = ''; - if (isset($info['query'])) { - parse_str(html_entity_decode($info['query']), $query); - if (!empty($params)) { - $params = array_replace($query, $params); - $queryString = http_build_query($query, '', '&'); - } else { - $params = $query; - $queryString = $info['query']; - } - } elseif (!empty($params)) { - $queryString = http_build_query($params, '', '&'); - } - $server['REQUEST_URI'] = $info['path'] . ('' !== $queryString ? '?' . $queryString : ''); - $server['QUERY_STRING'] = $queryString; - $options['cookie'] = $cookie; - $options['param'] = $params; - $options['file'] = $files; - $options['server'] = $server; - $options['url'] = $server['REQUEST_URI']; - $options['baseUrl'] = $info['path']; - $options['pathinfo'] = '/' == $info['path'] ? '/' : ltrim($info['path'], '/'); - $options['method'] = $server['REQUEST_METHOD']; - $options['domain'] = isset($info['scheme']) ? $info['scheme'] . '://' . $server['HTTP_HOST'] : ''; - $options['content'] = $content; - self::$instance = new self($options); - return self::$instance; - } - - /** - * 获取当前包含协议的域名 - * @access public - * @param string $domain 域名 - * @return string - */ - public function domain($domain = null) - { - if (!is_null($domain)) { - $this->domain = $domain; - return $this; - } elseif (!$this->domain) { - $this->domain = $this->scheme() . '://' . $this->host(); - } - return $this->domain; - } - - /** - * 获取当前完整URL 包括QUERY_STRING - * @access public - * @param string|true $url URL地址 true 带域名获取 - * @return string - */ - public function url($url = null) - { - if (!is_null($url) && true !== $url) { - $this->url = $url; - return $this; - } elseif (!$this->url) { - if (IS_CLI) { - $this->url = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; - } elseif (isset($_SERVER['HTTP_X_REWRITE_URL'])) { - $this->url = $_SERVER['HTTP_X_REWRITE_URL']; - } elseif (isset($_SERVER['REQUEST_URI'])) { - $this->url = $_SERVER['REQUEST_URI']; - } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { - $this->url = $_SERVER['ORIG_PATH_INFO'] . (!empty($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : ''); - } else { - $this->url = ''; - } - } - return true === $url ? $this->domain() . $this->url : $this->url; - } - - /** - * 获取当前URL 不含QUERY_STRING - * @access public - * @param string $url URL地址 - * @return string - */ - public function baseUrl($url = null) - { - if (!is_null($url) && true !== $url) { - $this->baseUrl = $url; - return $this; - } elseif (!$this->baseUrl) { - $str = $this->url(); - $this->baseUrl = strpos($str, '?') ? strstr($str, '?', true) : $str; - } - return true === $url ? $this->domain() . $this->baseUrl : $this->baseUrl; - } - - /** - * 获取当前执行的文件 SCRIPT_NAME - * @access public - * @param string $file 当前执行的文件 - * @return string - */ - public function baseFile($file = null) - { - if (!is_null($file) && true !== $file) { - $this->baseFile = $file; - return $this; - } elseif (!$this->baseFile) { - $url = ''; - if (!IS_CLI) { - $script_name = basename($_SERVER['SCRIPT_FILENAME']); - if (basename($_SERVER['SCRIPT_NAME']) === $script_name) { - $url = $_SERVER['SCRIPT_NAME']; - } elseif (basename($_SERVER['PHP_SELF']) === $script_name) { - $url = $_SERVER['PHP_SELF']; - } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $script_name) { - $url = $_SERVER['ORIG_SCRIPT_NAME']; - } elseif (($pos = strpos($_SERVER['PHP_SELF'], '/' . $script_name)) !== false) { - $url = substr($_SERVER['SCRIPT_NAME'], 0, $pos) . '/' . $script_name; - } elseif (isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'], $_SERVER['DOCUMENT_ROOT']) === 0) { - $url = str_replace('\\', '/', str_replace($_SERVER['DOCUMENT_ROOT'], '', $_SERVER['SCRIPT_FILENAME'])); - } - } - $this->baseFile = $url; - } - return true === $file ? $this->domain() . $this->baseFile : $this->baseFile; - } - - /** - * 获取URL访问根地址 - * @access public - * @param string $url URL地址 - * @return string - */ - public function root($url = null) - { - if (!is_null($url) && true !== $url) { - $this->root = $url; - return $this; - } elseif (!$this->root) { - $file = $this->baseFile(); - if ($file && 0 !== strpos($this->url(), $file)) { - $file = str_replace('\\', '/', dirname($file)); - } - $this->root = rtrim($file, '/'); - } - return true === $url ? $this->domain() . $this->root : $this->root; - } - - /** - * 获取当前请求URL的pathinfo信息(含URL后缀) - * @access public - * @return string - */ - public function pathinfo() - { - if (is_null($this->pathinfo)) { - if (isset($_GET[Config::get('var_pathinfo')])) { - // 判断URL里面是否有兼容模式参数 - $_SERVER['PATH_INFO'] = $_GET[Config::get('var_pathinfo')]; - unset($_GET[Config::get('var_pathinfo')]); - } elseif (IS_CLI) { - // CLI模式下 index.php module/controller/action/params/... - $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; - } - - // 分析PATHINFO信息 - if (!isset($_SERVER['PATH_INFO'])) { - foreach (Config::get('pathinfo_fetch') as $type) { - if (!empty($_SERVER[$type])) { - $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? - substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; - break; - } - } - } - $this->pathinfo = empty($_SERVER['PATH_INFO']) ? '/' : ltrim($_SERVER['PATH_INFO'], '/'); - } - return $this->pathinfo; - } - - /** - * 获取当前请求URL的pathinfo信息(不含URL后缀) - * @access public - * @return string - */ - public function path() - { - if (is_null($this->path)) { - $suffix = Config::get('url_html_suffix'); - $pathinfo = $this->pathinfo(); - if (false === $suffix) { - // 禁止伪静态访问 - $this->path = $pathinfo; - } elseif ($suffix) { - // 去除正常的URL后缀 - $this->path = preg_replace('/\.(' . ltrim($suffix, '.') . ')$/i', '', $pathinfo); - } else { - // 允许任何后缀访问 - $this->path = preg_replace('/\.' . $this->ext() . '$/i', '', $pathinfo); - } - } - return $this->path; - } - - /** - * 当前URL的访问后缀 - * @access public - * @return string - */ - public function ext() - { - return pathinfo($this->pathinfo(), PATHINFO_EXTENSION); - } - - /** - * 获取当前请求的时间 - * @access public - * @param bool $float 是否使用浮点类型 - * @return integer|float - */ - public function time($float = false) - { - return $float ? $_SERVER['REQUEST_TIME_FLOAT'] : $_SERVER['REQUEST_TIME']; - } - - /** - * 当前请求的资源类型 - * @access public - * @return false|string - */ - public function type() - { - $accept = isset($this->server['HTTP_ACCEPT']) ? $this->server['HTTP_ACCEPT'] : $_SERVER['HTTP_ACCEPT']; - if (empty($accept)) { - return false; - } - - foreach ($this->mimeType as $key => $val) { - $array = explode(',', $val); - foreach ($array as $k => $v) { - if (stristr($accept, $v)) { - return $key; - } - } - } - return false; - } - - /** - * 设置资源类型 - * @access public - * @param string|array $type 资源类型名 - * @param string $val 资源类型 - * @return void - */ - public function mimeType($type, $val = '') - { - if (is_array($type)) { - $this->mimeType = array_merge($this->mimeType, $type); - } else { - $this->mimeType[$type] = $val; - } - } - - /** - * 当前的请求类型 - * @access public - * @param bool $method true 获取原始请求类型 - * @return string - */ - public function method($method = false) - { - if (true === $method) { - // 获取原始请求类型 - return IS_CLI ? 'GET' : (isset($this->server['REQUEST_METHOD']) ? $this->server['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD']); - } elseif (!$this->method) { - if (isset($_POST[Config::get('var_method')])) { - $this->method = strtoupper($_POST[Config::get('var_method')]); - $this->{$this->method}($_POST); - } elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) { - $this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']); - } else { - $this->method = IS_CLI ? 'GET' : (isset($this->server['REQUEST_METHOD']) ? $this->server['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD']); - } - } - return $this->method; - } - - /** - * 是否为GET请求 - * @access public - * @return bool - */ - public function isGet() - { - return $this->method() == 'GET'; - } - - /** - * 是否为POST请求 - * @access public - * @return bool - */ - public function isPost() - { - return $this->method() == 'POST'; - } - - /** - * 是否为PUT请求 - * @access public - * @return bool - */ - public function isPut() - { - return $this->method() == 'PUT'; - } - - /** - * 是否为DELTE请求 - * @access public - * @return bool - */ - public function isDelete() - { - return $this->method() == 'DELETE'; - } - - /** - * 是否为HEAD请求 - * @access public - * @return bool - */ - public function isHead() - { - return $this->method() == 'HEAD'; - } - - /** - * 是否为PATCH请求 - * @access public - * @return bool - */ - public function isPatch() - { - return $this->method() == 'PATCH'; - } - - /** - * 是否为OPTIONS请求 - * @access public - * @return bool - */ - public function isOptions() - { - return $this->method() == 'OPTIONS'; - } - - /** - * 是否为cli - * @access public - * @return bool - */ - public function isCli() - { - return PHP_SAPI == 'cli'; - } - - /** - * 是否为cgi - * @access public - * @return bool - */ - public function isCgi() - { - return strpos(PHP_SAPI, 'cgi') === 0; - } - - /** - * 设置获取获取当前请求的参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function param($name = '', $default = null, $filter = '') - { - if (empty($this->param)) { - $method = $this->method(true); - // 自动获取请求变量 - switch ($method) { - case 'POST': - $vars = $this->post(false); - break; - case 'PUT': - case 'DELETE': - case 'PATCH': - $vars = $this->put(false); - break; - default: - $vars = []; - } - // 当前请求参数和URL地址中的参数合并 - $this->param = array_merge($this->get(false), $vars, $this->route(false)); - } - if (true === $name) { - // 获取包含文件上传信息的数组 - $file = $this->file(); - $data = array_merge($this->param, $file); - return $this->input($data, '', $default, $filter); - } - return $this->input($this->param, $name, $default, $filter); - } - - /** - * 设置获取获取路由参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function route($name = '', $default = null, $filter = '') - { - if (is_array($name)) { - $this->param = []; - return $this->route = array_merge($this->route, $name); - } - return $this->input($this->route, $name, $default, $filter); - } - - /** - * 设置获取获取GET参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function get($name = '', $default = null, $filter = '') - { - if (empty($this->get)) { - $this->get = $_GET; - } - if (is_array($name)) { - $this->param = []; - return $this->get = array_merge($this->get, $name); - } - return $this->input($this->get, $name, $default, $filter); - } - - /** - * 设置获取获取POST参数 - * @access public - * @param string $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function post($name = '', $default = null, $filter = '') - { - if (empty($this->post)) { - $this->post = $_POST; - } - if (is_array($name)) { - $this->param = []; - return $this->post = array_merge($this->post, $name); - } - return $this->input($this->post, $name, $default, $filter); - } - - /** - * 设置获取获取PUT参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function put($name = '', $default = null, $filter = '') - { - if (is_null($this->put)) { - $content = $this->input; - if (strpos($content, '":')) { - $this->put = json_decode($content, true); - } else { - parse_str($content, $this->put); - } - } - if (is_array($name)) { - $this->param = []; - return $this->put = is_null($this->put) ? $name : array_merge($this->put, $name); - } - - return $this->input($this->put, $name, $default, $filter); - } - - /** - * 设置获取获取DELETE参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function delete($name = '', $default = null, $filter = '') - { - return $this->put($name, $default, $filter); - } - - /** - * 设置获取获取PATCH参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function patch($name = '', $default = null, $filter = '') - { - return $this->put($name, $default, $filter); - } - - /** - * 获取request变量 - * @param string $name 数据名称 - * @param string $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function request($name = '', $default = null, $filter = '') - { - if (empty($this->request)) { - $this->request = $_REQUEST; - } - if (is_array($name)) { - $this->param = []; - return $this->request = array_merge($this->request, $name); - } - return $this->input($this->request, $name, $default, $filter); - } - - /** - * 获取session数据 - * @access public - * @param string|array $name 数据名称 - * @param string $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function session($name = '', $default = null, $filter = '') - { - if (empty($this->session)) { - $this->session = Session::get(); - } - if (is_array($name)) { - return $this->session = array_merge($this->session, $name); - } - return $this->input($this->session, $name, $default, $filter); - } - - /** - * 获取cookie参数 - * @access public - * @param string|array $name 数据名称 - * @param string $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function cookie($name = '', $default = null, $filter = '') - { - if (empty($this->cookie)) { - $this->cookie = $_COOKIE; - } - if (is_array($name)) { - return $this->cookie = array_merge($this->cookie, $name); - } - return $this->input($this->cookie, $name, $default, $filter); - } - - /** - * 获取server参数 - * @access public - * @param string|array $name 数据名称 - * @param string $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function server($name = '', $default = null, $filter = '') - { - if (empty($this->server)) { - $this->server = $_SERVER; - } - if (is_array($name)) { - return $this->server = array_merge($this->server, $name); - } - return $this->input($this->server, false === $name ? false : strtoupper($name), $default, $filter); - } - - /** - * 获取上传的文件信息 - * @access public - * @param string|array $name 名称 - * @return null|array|\think\File - */ - public function file($name = '') - { - if (empty($this->file)) { - $this->file = isset($_FILES) ? $_FILES : []; - } - if (is_array($name)) { - return $this->file = array_merge($this->file, $name); - } - $files = $this->file; - if (!empty($files)) { - // 处理上传文件 - $array = []; - foreach ($files as $key => $file) { - if (is_array($file['name'])) { - $item = []; - $keys = array_keys($file); - $count = count($file['name']); - for ($i = 0; $i < $count; $i++) { - if (empty($file['tmp_name'][$i])) { - continue; - } - $temp['key'] = $key; - foreach ($keys as $_key) { - $temp[$_key] = $file[$_key][$i]; - } - $item[] = (new File($temp['tmp_name']))->setUploadInfo($temp); - } - $array[$key] = $item; - } else { - if ($file instanceof File) { - $array[$key] = $file; - } else { - if (empty($file['tmp_name'])) { - continue; - } - $array[$key] = (new File($file['tmp_name']))->setUploadInfo($file); - } - } - } - if (strpos($name, '.')) { - list($name, $sub) = explode('.', $name); - } - if ('' === $name) { - // 获取全部文件 - return $array; - } elseif (isset($sub) && isset($array[$name][$sub])) { - return $array[$name][$sub]; - } elseif (isset($array[$name])) { - return $array[$name]; - } - } - return null; - } - - /** - * 获取环境变量 - * @param string|array $name 数据名称 - * @param string $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function env($name = '', $default = null, $filter = '') - { - if (empty($this->env)) { - $this->env = $_ENV; - } - if (is_array($name)) { - return $this->env = array_merge($this->env, $name); - } - return $this->input($this->env, false === $name ? false : strtoupper($name), $default, $filter); - } - - /** - * 设置或者获取当前的Header - * @access public - * @param string|array $name header名称 - * @param string $default 默认值 - * @return string - */ - public function header($name = '', $default = null) - { - if (empty($this->header)) { - $header = []; - if (function_exists('apache_request_headers') && $result = apache_request_headers()) { - $header = $result; - } else { - $server = $this->server ?: $_SERVER; - foreach ($server as $key => $val) { - if (0 === strpos($key, 'HTTP_')) { - $key = str_replace('_', '-', strtolower(substr($key, 5))); - $header[$key] = $val; - } - } - if (isset($server['CONTENT_TYPE'])) { - $header['content-type'] = $server['CONTENT_TYPE']; - } - if (isset($server['CONTENT_LENGTH'])) { - $header['content-length'] = $server['CONTENT_LENGTH']; - } - } - $this->header = array_change_key_case($header); - } - if (is_array($name)) { - return $this->header = array_merge($this->header, $name); - } - if ('' === $name) { - return $this->header; - } - $name = str_replace('_', '-', strtolower($name)); - return isset($this->header[$name]) ? $this->header[$name] : $default; - } - - /** - * 获取变量 支持过滤和默认值 - * @param array $data 数据源 - * @param string|false $name 字段名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤函数 - * @return mixed - */ - public function input($data = [], $name = '', $default = null, $filter = '') - { - if (false === $name) { - // 获取原始数据 - return $data; - } - $name = (string) $name; - if ('' != $name) { - // 解析name - if (strpos($name, '/')) { - list($name, $type) = explode('/', $name); - } else { - $type = 's'; - } - // 按.拆分成多维数组进行判断 - foreach (explode('.', $name) as $val) { - if (isset($data[$val])) { - $data = $data[$val]; - } else { - // 无输入数据,返回默认值 - return $default; - } - } - if (is_object($data)) { - return $data; - } - } - - // 解析过滤器 - if (is_null($filter)) { - $filter = []; - } else { - $filter = $filter ?: $this->filter; - if (is_string($filter)) { - $filter = explode(',', $filter); - } else { - $filter = (array) $filter; - } - } - - $filter[] = $default; - if (is_array($data)) { - array_walk_recursive($data, [$this, 'filterValue'], $filter); - reset($data); - } else { - $this->filterValue($data, $name, $filter); - } - - if (isset($type) && $data !== $default) { - // 强制类型转换 - $this->typeCast($data, $type); - } - return $data; - } - - /** - * 设置或获取当前的过滤规则 - * @param mixed $filter 过滤规则 - * @return mixed - */ - public function filter($filter = null) - { - if (is_null($filter)) { - return $this->filter; - } else { - $this->filter = $filter; - } - } - - /** - * 递归过滤给定的值 - * @param mixed $value 键值 - * @param mixed $key 键名 - * @param array $filters 过滤方法+默认值 - * @return mixed - */ - private function filterValue(&$value, $key, $filters) - { - $default = array_pop($filters); - foreach ($filters as $filter) { - if (is_callable($filter)) { - // 调用函数或者方法过滤 - $value = call_user_func($filter, $value); - } elseif (is_scalar($value)) { - if (strpos($filter, '/')) { - // 正则过滤 - if (!preg_match($filter, $value)) { - // 匹配不成功返回默认值 - $value = $default; - break; - } - } elseif (!empty($filter)) { - // filter函数不存在时, 则使用filter_var进行过滤 - // filter为非整形值时, 调用filter_id取得过滤id - $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter)); - if (false === $value) { - $value = $default; - break; - } - } - } - } - return $this->filterExp($value); - } - - /** - * 过滤表单中的表达式 - * @param string $value - * @return void - */ - public function filterExp(&$value) - { - // 过滤查询特殊字符 - if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) { - $value .= ' '; - } - // TODO 其他安全过滤 - } - - /** - * 强制类型转换 - * @param string $data - * @param string $type - * @return mixed - */ - private function typeCast(&$data, $type) - { - switch (strtolower($type)) { - // 数组 - case 'a': - $data = (array) $data; - break; - // 数字 - case 'd': - $data = (int) $data; - break; - // 浮点 - case 'f': - $data = (float) $data; - break; - // 布尔 - case 'b': - $data = (boolean) $data; - break; - // 字符串 - case 's': - default: - if (is_scalar($data)) { - $data = (string) $data; - } else { - throw new \InvalidArgumentException('variable type error:' . gettype($data)); - } - } - } - - /** - * 是否存在某个请求参数 - * @access public - * @param string $name 变量名 - * @param string $type 变量类型 - * @param bool $checkEmpty 是否检测空值 - * @return mixed - */ - public function has($name, $type = 'param', $checkEmpty = false) - { - if (empty($this->$type)) { - $param = $this->$type(); - } else { - $param = $this->$type; - } - // 按.拆分成多维数组进行判断 - foreach (explode('.', $name) as $val) { - if (isset($param[$val])) { - $param = $param[$val]; - } else { - return false; - } - } - return ($checkEmpty && '' === $param) ? false : true; - } - - /** - * 获取指定的参数 - * @access public - * @param string|array $name 变量名 - * @param string $type 变量类型 - * @return mixed - */ - public function only($name, $type = 'param') - { - $param = $this->$type(); - if (is_string($name)) { - $name = explode(',', $name); - } - $item = []; - foreach ($name as $key) { - if (isset($param[$key])) { - $item[$key] = $param[$key]; - } - } - return $item; - } - - /** - * 排除指定参数获取 - * @access public - * @param string|array $name 变量名 - * @param string $type 变量类型 - * @return mixed - */ - public function except($name, $type = 'param') - { - $param = $this->$type(); - if (is_string($name)) { - $name = explode(',', $name); - } - foreach ($name as $key) { - if (isset($param[$key])) { - unset($param[$key]); - } - } - return $param; - } - - /** - * 当前是否ssl - * @access public - * @return bool - */ - public function isSsl() - { - $server = array_merge($_SERVER, $this->server); - if (isset($server['HTTPS']) && ('1' == $server['HTTPS'] || 'on' == strtolower($server['HTTPS']))) { - return true; - } elseif (isset($server['REQUEST_SCHEME']) && 'https' == $server['REQUEST_SCHEME']) { - return true; - } elseif (isset($server['SERVER_PORT']) && ('443' == $server['SERVER_PORT'])) { - return true; - } elseif (isset($server['HTTP_X_FORWARDED_PROTO']) && 'https' == $server['HTTP_X_FORWARDED_PROTO']) { - return true; - } - return false; - } - - /** - * 当前是否Ajax请求 - * @access public - * @param bool $ajax true 获取原始ajax请求 - * @return bool - */ - public function isAjax($ajax = false) - { - $value = $this->server('HTTP_X_REQUESTED_WITH', '', 'strtolower'); - $result = ('xmlhttprequest' == $value) ? true : false; - if (true === $ajax) { - return $result; - } else { - return $this->param(Config::get('var_ajax')) ? true : $result; - } - } - - /** - * 当前是否Pjax请求 - * @access public - * @param bool $pjax true 获取原始pjax请求 - * @return bool - */ - public function isPjax($pjax = false) - { - $result = !is_null($this->server('HTTP_X_PJAX')) ? true : false; - if (true === $pjax) { - return $result; - } else { - return $this->param(Config::get('var_pjax')) ? true : $result; - } - } - - /** - * 获取客户端IP地址 - * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 - * @param boolean $adv 是否进行高级模式获取(有可能被伪装) - * @return mixed - */ - public function ip($type = 0, $adv = false) - { - $type = $type ? 1 : 0; - static $ip = null; - if (null !== $ip) { - return $ip[$type]; - } - - if ($adv) { - if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { - $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); - $pos = array_search('unknown', $arr); - if (false !== $pos) { - unset($arr[$pos]); - } - $ip = trim(current($arr)); - } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { - $ip = $_SERVER['HTTP_CLIENT_IP']; - } elseif (isset($_SERVER['REMOTE_ADDR'])) { - $ip = $_SERVER['REMOTE_ADDR']; - } - } elseif (isset($_SERVER['REMOTE_ADDR'])) { - $ip = $_SERVER['REMOTE_ADDR']; - } - // IP地址合法验证 - $long = sprintf("%u", ip2long($ip)); - $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); - return $ip[$type]; - } - - /** - * 检测是否使用手机访问 - * @access public - * @return bool - */ - public function isMobile() - { - if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) { - return true; - } elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) { - return true; - } elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) { - return true; - } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) { - return true; - } else { - return false; - } - } - - /** - * 当前URL地址中的scheme参数 - * @access public - * @return string - */ - public function scheme() - { - return $this->isSsl() ? 'https' : 'http'; - } - - /** - * 当前请求URL地址中的query参数 - * @access public - * @return string - */ - public function query() - { - return $this->server('QUERY_STRING'); - } - - /** - * 当前请求的host - * @access public - * @return string - */ - public function host() - { - return $this->server('HTTP_HOST'); - } - - /** - * 当前请求URL地址中的port参数 - * @access public - * @return integer - */ - public function port() - { - return $this->server('SERVER_PORT'); - } - - /** - * 当前请求 SERVER_PROTOCOL - * @access public - * @return integer - */ - public function protocol() - { - return $this->server('SERVER_PROTOCOL'); - } - - /** - * 当前请求 REMOTE_PORT - * @access public - * @return integer - */ - public function remotePort() - { - return $this->server('REMOTE_PORT'); - } - - /** - * 获取当前请求的路由信息 - * @access public - * @param array $route 路由名称 - * @return array - */ - public function routeInfo($route = []) - { - if (!empty($route)) { - $this->routeInfo = $route; - } else { - return $this->routeInfo; - } - } - - /** - * 设置或者获取当前请求的调度信息 - * @access public - * @param array $dispatch 调度信息 - * @return array - */ - public function dispatch($dispatch = null) - { - if (!is_null($dispatch)) { - $this->dispatch = $dispatch; - } - return $this->dispatch; - } - - /** - * 设置或者获取当前的模块名 - * @access public - * @param string $module 模块名 - * @return string|Request - */ - public function module($module = null) - { - if (!is_null($module)) { - $this->module = $module; - return $this; - } else { - return $this->module ?: ''; - } - } - - /** - * 设置或者获取当前的控制器名 - * @access public - * @param string $controller 控制器名 - * @return string|Request - */ - public function controller($controller = null) - { - if (!is_null($controller)) { - $this->controller = $controller; - return $this; - } else { - return $this->controller ?: ''; - } - } - - /** - * 设置或者获取当前的操作名 - * @access public - * @param string $action 操作名 - * @return string|Request - */ - public function action($action = null) - { - if (!is_null($action)) { - $this->action = $action; - return $this; - } else { - return $this->action ?: ''; - } - } - - /** - * 设置或者获取当前的语言 - * @access public - * @param string $lang 语言名 - * @return string|Request - */ - public function langset($lang = null) - { - if (!is_null($lang)) { - $this->langset = $lang; - return $this; - } else { - return $this->langset ?: ''; - } - } - - /** - * 设置或者获取当前请求的content - * @access public - * @return string - */ - public function getContent() - { - if (is_null($this->content)) { - $this->content = $this->input; - } - return $this->content; - } - - /** - * 获取当前请求的php://input - * @access public - * @return string - */ - public function getInput() - { - return $this->input; - } - - /** - * 生成请求令牌 - * @access public - * @param string $name 令牌名称 - * @param mixed $type 令牌生成方法 - * @return string - */ - public function token($name = '__token__', $type = 'md5') - { - $type = is_callable($type) ? $type : 'md5'; - $token = call_user_func($type, $_SERVER['REQUEST_TIME_FLOAT']); - if ($this->isAjax()) { - header($name . ': ' . $token); - } - Session::set($name, $token); - return $token; - } - - /** - * 设置当前地址的请求缓存 - * @access public - * @param string $key 缓存标识,支持变量规则 ,例如 item/:name/:id - * @param mixed $expire 缓存有效期 - * @return void - */ - public function cache($key, $expire = null) - { - if (false !== $key && $this->isGet() && !$this->isCheckCache) { - // 标记请求缓存检查 - $this->isCheckCache = true; - if (false === $expire) { - // 关闭当前缓存 - return; - } - if ($key instanceof \Closure) { - $key = call_user_func_array($key, [$this]); - } elseif (true === $key) { - // 自动缓存功能 - $key = '__URL__'; - } elseif (strpos($key, '|')) { - list($key, $fun) = explode('|', $key); - } - // 特殊规则替换 - if (false !== strpos($key, '__')) { - $key = str_replace(['__MODULE__', '__CONTROLLER__', '__ACTION__', '__URL__'], [$this->module, $this->controller, $this->action, md5($this->url())], $key); - } - - if (false !== strpos($key, ':')) { - $param = $this->param(); - foreach ($param as $item => $val) { - if (is_string($val) && false !== strpos($key, ':' . $item)) { - $key = str_replace(':' . $item, $val, $key); - } - } - } elseif (strpos($key, ']')) { - if ('[' . $this->ext() . ']' == $key) { - // 缓存某个后缀的请求 - $key = md5($this->url()); - } else { - return; - } - } - if (isset($fun)) { - $key = $fun($key); - } - - if (strtotime($this->server('HTTP_IF_MODIFIED_SINCE')) + $expire > $_SERVER['REQUEST_TIME']) { - // 读取缓存 - $response = Response::create()->code(304); - throw new \think\exception\HttpResponseException($response); - } elseif (Cache::has($key)) { - list($content, $header) = Cache::get($key); - $response = Response::create($content)->header($header); - throw new \think\exception\HttpResponseException($response); - } else { - $this->cache = [$key, $expire]; - } - } - } - - /** - * 读取请求缓存设置 - * @access public - * @return array - */ - public function getCache() - { - return $this->cache; - } - - /** - * 设置当前请求绑定的对象实例 - * @access public - * @param string $name 绑定的对象标识 - * @param mixed $obj 绑定的对象实例 - * @return mixed - */ - public function bind($name, $obj = null) - { - if (is_array($name)) { - $this->bind = array_merge($this->bind, $name); - } else { - $this->bind[$name] = $obj; - } - } - - public function __set($name, $value) - { - $this->bind[$name] = $value; - } - - public function __get($name) - { - return isset($this->bind[$name]) ? $this->bind[$name] : null; - } - - public function __isset($name) - { - return isset($this->bind[$name]); - } -} diff --git a/thinkphp/library/think/Response.php b/thinkphp/library/think/Response.php deleted file mode 100755 index a202ce7..0000000 --- a/thinkphp/library/think/Response.php +++ /dev/null @@ -1,326 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\Cache; -use think\Config; -use think\Debug; -use think\Env; -use think\Request; -use think\response\Json as JsonResponse; -use think\response\Jsonp as JsonpResponse; -use think\response\Redirect as RedirectResponse; -use think\response\View as ViewResponse; -use think\response\Xml as XmlResponse; - -class Response -{ - - // 原始数据 - protected $data; - - // 当前的contentType - protected $contentType = 'text/html'; - - // 字符集 - protected $charset = 'utf-8'; - - //状态 - protected $code = 200; - - // 输出参数 - protected $options = []; - // header参数 - protected $header = []; - - protected $content = null; - - /** - * 架构函数 - * @access public - * @param mixed $data 输出数据 - * @param int $code - * @param array $header - * @param array $options 输出参数 - */ - public function __construct($data = '', $code = 200, array $header = [], $options = []) - { - $this->data($data); - $this->header = $header; - $this->code = $code; - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - $this->contentType($this->contentType, $this->charset); - } - - /** - * 创建Response对象 - * @access public - * @param mixed $data 输出数据 - * @param string $type 输出类型 - * @param int $code - * @param array $header - * @param array $options 输出参数 - * @return Response|JsonResponse|ViewResponse|XmlResponse|RedirectResponse|JsonpResponse - */ - public static function create($data = '', $type = '', $code = 200, array $header = [], $options = []) - { - $type = empty($type) ? 'null' : strtolower($type); - - $class = false !== strpos($type, '\\') ? $type : '\\think\\response\\' . ucfirst($type); - if (class_exists($class)) { - $response = new $class($data, $code, $header, $options); - } else { - $response = new static($data, $code, $header, $options); - } - - return $response; - } - - /** - * 发送数据到客户端 - * @access public - * @return mixed - * @throws \InvalidArgumentException - */ - public function send() - { - // 处理输出数据 - $data = $this->getContent(); - - // Trace调试注入 - if (Env::get('app_trace', Config::get('app_trace'))) { - Debug::inject($this, $data); - } - - if (!headers_sent() && !empty($this->header)) { - // 发送状态码 - http_response_code($this->code); - // 发送头部信息 - foreach ($this->header as $name => $val) { - header($name . ':' . $val); - } - } - if (200 == $this->code) { - $cache = Request::instance()->getCache(); - if ($cache) { - header('Cache-Control: max-age=' . $cache[1] . ',must-revalidate'); - header('Last-Modified:' . gmdate('D, d M Y H:i:s') . ' GMT'); - header('Expires:' . gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + $cache[1]) . ' GMT'); - $header['Content-Type'] = $this->header['Content-Type']; - Cache::set($cache[0], [$data, $header], $cache[1]); - } - } - echo $data; - - if (function_exists('fastcgi_finish_request')) { - // 提高页面响应 - fastcgi_finish_request(); - } - - // 监听response_end - Hook::listen('response_end', $this); - - // 清空当次请求有效的数据 - Session::flush(); - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - */ - protected function output($data) - { - return $data; - } - - /** - * 输出的参数 - * @access public - * @param mixed $options 输出参数 - * @return $this - */ - public function options($options = []) - { - $this->options = array_merge($this->options, $options); - return $this; - } - - /** - * 输出数据设置 - * @access public - * @param mixed $data 输出数据 - * @return $this - */ - public function data($data) - { - $this->data = $data; - return $this; - } - - /** - * 设置响应头 - * @access public - * @param string|array $name 参数名 - * @param string $value 参数值 - * @return $this - */ - public function header($name, $value = null) - { - if (is_array($name)) { - $this->header = array_merge($this->header, $name); - } else { - $this->header[$name] = $value; - } - return $this; - } - - /** - * 设置页面输出内容 - * @param $content - * @return $this - */ - public function content($content) - { - if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable([ - $content, - '__toString', - ]) - ) { - throw new \InvalidArgumentException(sprintf('variable type error: %s', gettype($content))); - } - - $this->content = (string) $content; - - return $this; - } - - /** - * 发送HTTP状态 - * @param integer $code 状态码 - * @return $this - */ - public function code($code) - { - $this->code = $code; - return $this; - } - - /** - * LastModified - * @param string $time - * @return $this - */ - public function lastModified($time) - { - $this->header['Last-Modified'] = $time; - return $this; - } - - /** - * Expires - * @param string $time - * @return $this - */ - public function expires($time) - { - $this->header['Expires'] = $time; - return $this; - } - - /** - * ETag - * @param string $eTag - * @return $this - */ - public function eTag($eTag) - { - $this->header['ETag'] = $eTag; - return $this; - } - - /** - * 页面缓存控制 - * @param string $cache 状态码 - * @return $this - */ - public function cacheControl($cache) - { - $this->header['Cache-control'] = $cache; - return $this; - } - - /** - * 页面输出类型 - * @param string $contentType 输出类型 - * @param string $charset 输出编码 - * @return $this - */ - public function contentType($contentType, $charset = 'utf-8') - { - $this->header['Content-Type'] = $contentType . '; charset=' . $charset; - return $this; - } - - /** - * 获取头部信息 - * @param string $name 头部名称 - * @return mixed - */ - public function getHeader($name = '') - { - return !empty($name) ? $this->header[$name] : $this->header; - } - - /** - * 获取原始数据 - * @return mixed - */ - public function getData() - { - return $this->data; - } - - /** - * 获取输出数据 - * @return mixed - */ - public function getContent() - { - if (null == $this->content) { - $content = $this->output($this->data); - - if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable([ - $content, - '__toString', - ]) - ) { - throw new \InvalidArgumentException(sprintf('variable type error: %s', gettype($content))); - } - - $this->content = (string) $content; - } - return $this->content; - } - - /** - * 获取状态码 - * @return integer - */ - public function getCode() - { - return $this->code; - } -} diff --git a/thinkphp/library/think/Route.php b/thinkphp/library/think/Route.php deleted file mode 100755 index c8eb24e..0000000 --- a/thinkphp/library/think/Route.php +++ /dev/null @@ -1,1584 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\App; -use think\Config; -use think\exception\HttpException; -use think\Hook; -use think\Loader; -use think\Log; -use think\Request; -use think\Response; - -class Route -{ - // 路由规则 - private static $rules = [ - 'get' => [], - 'post' => [], - 'put' => [], - 'delete' => [], - 'patch' => [], - 'head' => [], - 'options' => [], - '*' => [], - 'alias' => [], - 'domain' => [], - 'pattern' => [], - 'name' => [], - ]; - - // REST路由操作方法定义 - private static $rest = [ - 'index' => ['get', '', 'index'], - 'create' => ['get', '/create', 'create'], - 'edit' => ['get', '/:id/edit', 'edit'], - 'read' => ['get', '/:id', 'read'], - 'save' => ['post', '', 'save'], - 'update' => ['put', '/:id', 'update'], - 'delete' => ['delete', '/:id', 'delete'], - ]; - - // 不同请求类型的方法前缀 - private static $methodPrefix = [ - 'get' => 'get', - 'post' => 'post', - 'put' => 'put', - 'delete' => 'delete', - 'patch' => 'patch', - ]; - - // 子域名 - private static $subDomain = ''; - // 域名绑定 - private static $bind = []; - // 当前分组信息 - private static $group = []; - // 当前子域名绑定 - private static $domainBind; - private static $domainRule; - // 当前域名 - private static $domain; - // 当前路由执行过程中的参数 - private static $option = []; - - /** - * 注册变量规则 - * @access public - * @param string|array $name 变量名 - * @param string $rule 变量规则 - * @return void - */ - public static function pattern($name = null, $rule = '') - { - if (is_array($name)) { - self::$rules['pattern'] = array_merge(self::$rules['pattern'], $name); - } else { - self::$rules['pattern'][$name] = $rule; - } - } - - /** - * 注册子域名部署规则 - * @access public - * @param string|array $domain 子域名 - * @param mixed $rule 路由规则 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function domain($domain, $rule = '', $option = [], $pattern = []) - { - if (is_array($domain)) { - foreach ($domain as $key => $item) { - self::domain($key, $item, $option, $pattern); - } - } elseif ($rule instanceof \Closure) { - // 执行闭包 - self::setDomain($domain); - call_user_func_array($rule, []); - self::setDomain(null); - } elseif (is_array($rule)) { - self::setDomain($domain); - self::group('', function () use ($rule) { - // 动态注册域名的路由规则 - self::registerRules($rule); - }, $option, $pattern); - self::setDomain(null); - } else { - self::$rules['domain'][$domain]['[bind]'] = [$rule, $option, $pattern]; - } - } - - private static function setDomain($domain) - { - self::$domain = $domain; - } - - /** - * 设置路由绑定 - * @access public - * @param mixed $bind 绑定信息 - * @param string $type 绑定类型 默认为module 支持 namespace class controller - * @return mixed - */ - public static function bind($bind, $type = 'module') - { - self::$bind = ['type' => $type, $type => $bind]; - } - - /** - * 设置或者获取路由标识 - * @access public - * @param string|array $name 路由命名标识 数组表示批量设置 - * @param array $value 路由地址及变量信息 - * @return array - */ - public static function name($name = '', $value = null) - { - if (is_array($name)) { - return self::$rules['name'] = $name; - } elseif ('' === $name) { - return self::$rules['name']; - } elseif (!is_null($value)) { - self::$rules['name'][$name][] = $value; - } else { - $name = strtolower($name); - return isset(self::$rules['name'][$name]) ? self::$rules['name'][$name] : null; - } - } - - /** - * 读取路由绑定 - * @access public - * @param string $type 绑定类型 - * @return mixed - */ - public static function getBind($type) - { - return isset(self::$bind[$type]) ? self::$bind[$type] : null; - } - - /** - * 导入配置文件的路由规则 - * @access public - * @param array $rule 路由规则 - * @param string $type 请求类型 - * @return void - */ - public static function import(array $rule, $type = '*') - { - // 检查域名部署 - if (isset($rule['__domain__'])) { - self::domain($rule['__domain__']); - unset($rule['__domain__']); - } - - // 检查变量规则 - if (isset($rule['__pattern__'])) { - self::pattern($rule['__pattern__']); - unset($rule['__pattern__']); - } - - // 检查路由别名 - if (isset($rule['__alias__'])) { - self::alias($rule['__alias__']); - unset($rule['__alias__']); - } - - // 检查资源路由 - if (isset($rule['__rest__'])) { - self::resource($rule['__rest__']); - unset($rule['__rest__']); - } - - self::registerRules($rule, strtolower($type)); - } - - // 批量注册路由 - protected static function registerRules($rules, $type = '*') - { - foreach ($rules as $key => $val) { - if (is_numeric($key)) { - $key = array_shift($val); - } - if (empty($val)) { - continue; - } - if (is_string($key) && 0 === strpos($key, '[')) { - $key = substr($key, 1, -1); - self::group($key, $val); - } elseif (is_array($val)) { - self::setRule($key, $val[0], $type, $val[1], isset($val[2]) ? $val[2] : []); - } else { - self::setRule($key, $val, $type); - } - } - } - - /** - * 注册路由规则 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param string $type 请求类型 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function rule($rule, $route = '', $type = '*', $option = [], $pattern = []) - { - $group = self::getGroup('name'); - if (!is_null($group)) { - // 路由分组 - $option = array_merge(self::getGroup('option'), $option); - $pattern = array_merge(self::getGroup('pattern'), $pattern); - } - - $type = strtolower($type); - - if (strpos($type, '|')) { - $option['method'] = $type; - $type = '*'; - } - if (is_array($rule) && empty($route)) { - foreach ($rule as $key => $val) { - if (is_numeric($key)) { - $key = array_shift($val); - } - if (is_array($val)) { - $route = $val[0]; - $option1 = array_merge($option, $val[1]); - $pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []); - } else { - $route = $val; - } - self::setRule($key, $route, $type, isset($option1) ? $option1 : $option, isset($pattern1) ? $pattern1 : $pattern, $group); - } - } else { - self::setRule($rule, $route, $type, $option, $pattern, $group); - } - - } - - /** - * 设置路由规则 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param string $type 请求类型 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @param string $group 所属分组 - * @return void - */ - protected static function setRule($rule, $route, $type = '*', $option = [], $pattern = [], $group = '') - { - if (is_array($rule)) { - $name = $rule[0]; - $rule = $rule[1]; - } elseif (is_string($route)) { - $name = $route; - } - if (!isset($option['complete_match'])) { - if (Config::get('route_complete_match')) { - $option['complete_match'] = true; - } elseif ('$' == substr($rule, -1, 1)) { - // 是否完整匹配 - $option['complete_match'] = true; - $rule = substr($rule, 0, -1); - } - } elseif (empty($option['complete_match']) && '$' == substr($rule, -1, 1)) { - // 是否完整匹配 - $option['complete_match'] = true; - $rule = substr($rule, 0, -1); - } - - if ('/' != $rule || $group) { - $rule = trim($rule, '/'); - } - $vars = self::parseVar($rule); - if (isset($name)) { - $key = $group ? $group . ($rule ? '/' . $rule : '') : $rule; - self::name(strtolower($name), [$key, $vars, self::$domain]); - } - if ($group) { - if ('*' != $type) { - $option['method'] = $type; - } - if (self::$domain) { - self::$rules['domain'][self::$domain]['*'][$group]['rule'][] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern]; - } else { - self::$rules['*'][$group]['rule'][] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern]; - } - } else { - if ('*' != $type && isset(self::$rules['*'][$rule])) { - unset(self::$rules['*'][$rule]); - } - if (self::$domain) { - self::$rules['domain'][self::$domain][$type][$rule] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern]; - } else { - self::$rules[$type][$rule] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern]; - } - if ('*' == $type) { - // 注册路由快捷方式 - foreach (['get', 'post', 'put', 'delete', 'patch', 'head', 'options'] as $method) { - if (self::$domain) { - self::$rules['domain'][self::$domain][$method][$rule] = true; - } else { - self::$rules[$method][$rule] = true; - } - } - } - } - } - - /** - * 设置当前执行的参数信息 - * @access public - * @param array $options 参数信息 - * @return mixed - */ - protected static function setOption($options = []) - { - self::$option[] = $options; - } - - /** - * 获取当前执行的所有参数信息 - * @access public - * @return array - */ - public static function getOption() - { - return self::$option; - } - - /** - * 获取当前的分组信息 - * @access public - * @param string $type 分组信息名称 name option pattern - * @return mixed - */ - public static function getGroup($type) - { - if (isset(self::$group[$type])) { - return self::$group[$type]; - } else { - return 'name' == $type ? null : []; - } - } - - /** - * 设置当前的路由分组 - * @access public - * @param string $name 分组名称 - * @param array $option 分组路由参数 - * @param array $pattern 分组变量规则 - * @return void - */ - public static function setGroup($name, $option = [], $pattern = []) - { - self::$group['name'] = $name; - self::$group['option'] = $option ?: []; - self::$group['pattern'] = $pattern ?: []; - } - - /** - * 注册路由分组 - * @access public - * @param string|array $name 分组名称或者参数 - * @param array|\Closure $routes 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function group($name, $routes, $option = [], $pattern = []) - { - if (is_array($name)) { - $option = $name; - $name = isset($option['name']) ? $option['name'] : ''; - } - // 分组 - $currentGroup = self::getGroup('name'); - if ($currentGroup) { - $name = $currentGroup . ($name ? '/' . ltrim($name, '/') : ''); - } - if (!empty($name)) { - if ($routes instanceof \Closure) { - $currentOption = self::getGroup('option'); - $currentPattern = self::getGroup('pattern'); - self::setGroup($name, array_merge($currentOption, $option), array_merge($currentPattern, $pattern)); - call_user_func_array($routes, []); - self::setGroup($currentGroup, $currentOption, $currentPattern); - if ($currentGroup != $name) { - self::$rules['*'][$name]['route'] = ''; - self::$rules['*'][$name]['var'] = self::parseVar($name); - self::$rules['*'][$name]['option'] = $option; - self::$rules['*'][$name]['pattern'] = $pattern; - } - } else { - $item = []; - foreach ($routes as $key => $val) { - if (is_numeric($key)) { - $key = array_shift($val); - } - if (is_array($val)) { - $route = $val[0]; - $option1 = array_merge($option, isset($val[1]) ? $val[1] : []); - $pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []); - } else { - $route = $val; - } - - $options = isset($option1) ? $option1 : $option; - $patterns = isset($pattern1) ? $pattern1 : $pattern; - if ('$' == substr($key, -1, 1)) { - // 是否完整匹配 - $options['complete_match'] = true; - $key = substr($key, 0, -1); - } - $key = trim($key, '/'); - $vars = self::parseVar($key); - $item[] = ['rule' => $key, 'route' => $route, 'var' => $vars, 'option' => $options, 'pattern' => $patterns]; - // 设置路由标识 - self::name($route, [$name . ($key ? '/' . $key : ''), $vars, self::$domain]); - } - self::$rules['*'][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern]; - } - - foreach (['get', 'post', 'put', 'delete', 'patch', 'head', 'options'] as $method) { - if (!isset(self::$rules[$method][$name])) { - self::$rules[$method][$name] = true; - } elseif (is_array(self::$rules[$method][$name])) { - self::$rules[$method][$name] = array_merge(self::$rules['*'][$name], self::$rules[$method][$name]); - } - } - - } elseif ($routes instanceof \Closure) { - // 闭包注册 - $currentOption = self::getGroup('option'); - $currentPattern = self::getGroup('pattern'); - self::setGroup('', array_merge($currentOption, $option), array_merge($currentPattern, $pattern)); - call_user_func_array($routes, []); - self::setGroup($currentGroup, $currentOption, $currentPattern); - } else { - // 批量注册路由 - self::rule($routes, '', '*', $option, $pattern); - } - } - - /** - * 注册路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function any($rule, $route = '', $option = [], $pattern = []) - { - self::rule($rule, $route, '*', $option, $pattern); - } - - /** - * 注册GET路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function get($rule, $route = '', $option = [], $pattern = []) - { - self::rule($rule, $route, 'GET', $option, $pattern); - } - - /** - * 注册POST路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function post($rule, $route = '', $option = [], $pattern = []) - { - self::rule($rule, $route, 'POST', $option, $pattern); - } - - /** - * 注册PUT路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function put($rule, $route = '', $option = [], $pattern = []) - { - self::rule($rule, $route, 'PUT', $option, $pattern); - } - - /** - * 注册DELETE路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function delete($rule, $route = '', $option = [], $pattern = []) - { - self::rule($rule, $route, 'DELETE', $option, $pattern); - } - - /** - * 注册PATCH路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function patch($rule, $route = '', $option = [], $pattern = []) - { - self::rule($rule, $route, 'PATCH', $option, $pattern); - } - - /** - * 注册资源路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function resource($rule, $route = '', $option = [], $pattern = []) - { - if (is_array($rule)) { - foreach ($rule as $key => $val) { - if (is_array($val)) { - list($val, $option, $pattern) = array_pad($val, 3, []); - } - self::resource($key, $val, $option, $pattern); - } - } else { - if (strpos($rule, '.')) { - // 注册嵌套资源路由 - $array = explode('.', $rule); - $last = array_pop($array); - $item = []; - foreach ($array as $val) { - $item[] = $val . '/:' . (isset($option['var'][$val]) ? $option['var'][$val] : $val . '_id'); - } - $rule = implode('/', $item) . '/' . $last; - } - // 注册资源路由 - foreach (self::$rest as $key => $val) { - if ((isset($option['only']) && !in_array($key, $option['only'])) - || (isset($option['except']) && in_array($key, $option['except']))) { - continue; - } - if (isset($last) && strpos($val[1], ':id') && isset($option['var'][$last])) { - $val[1] = str_replace(':id', ':' . $option['var'][$last], $val[1]); - } elseif (strpos($val[1], ':id') && isset($option['var'][$rule])) { - $val[1] = str_replace(':id', ':' . $option['var'][$rule], $val[1]); - } - $item = ltrim($rule . $val[1], '/'); - $option['rest'] = $key; - self::rule($item . '$', $route . '/' . $val[2], $val[0], $option, $pattern); - } - } - } - - /** - * 注册控制器路由 操作方法对应不同的请求后缀 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @return void - */ - public static function controller($rule, $route = '', $option = [], $pattern = []) - { - foreach (self::$methodPrefix as $type => $val) { - self::$type($rule . '/:action', $route . '/' . $val . ':action', $option, $pattern); - } - } - - /** - * 注册别名路由 - * @access public - * @param string|array $rule 路由别名 - * @param string $route 路由地址 - * @param array $option 路由参数 - * @return void - */ - public static function alias($rule = null, $route = '', $option = []) - { - if (is_array($rule)) { - self::$rules['alias'] = array_merge(self::$rules['alias'], $rule); - } else { - self::$rules['alias'][$rule] = $option ? [$route, $option] : $route; - } - } - - /** - * 设置不同请求类型下面的方法前缀 - * @access public - * @param string $method 请求类型 - * @param string $prefix 类型前缀 - * @return void - */ - public static function setMethodPrefix($method, $prefix = '') - { - if (is_array($method)) { - self::$methodPrefix = array_merge(self::$methodPrefix, array_change_key_case($method)); - } else { - self::$methodPrefix[strtolower($method)] = $prefix; - } - } - - /** - * rest方法定义和修改 - * @access public - * @param string $name 方法名称 - * @param array $resource 资源 - * @return void - */ - public static function rest($name, $resource = []) - { - if (is_array($name)) { - self::$rest = array_merge(self::$rest, $name); - } else { - self::$rest[$name] = $resource; - } - } - - /** - * 注册未匹配路由规则后的处理 - * @access public - * @param string $route 路由地址 - * @param string $method 请求类型 - * @param array $option 路由参数 - * @return void - */ - public static function miss($route, $method = '*', $option = []) - { - self::rule('__miss__', $route, $method, $option, []); - } - - /** - * 注册一个自动解析的URL路由 - * @access public - * @param string $route 路由地址 - * @return void - */ - public static function auto($route) - { - self::rule('__auto__', $route, '*', [], []); - } - - /** - * 获取或者批量设置路由定义 - * @access public - * @param mixed $rules 请求类型或者路由定义数组 - * @return array - */ - public static function rules($rules = '') - { - if (is_array($rules)) { - self::$rules = $rules; - } elseif ($rules) { - return true === $rules ? self::$rules : self::$rules[strtolower($rules)]; - } else { - $rules = self::$rules; - unset($rules['pattern'], $rules['alias'], $rules['domain'], $rules['name']); - return $rules; - } - } - - /** - * 检测子域名部署 - * @access public - * @param Request $request Request请求对象 - * @param array $currentRules 当前路由规则 - * @param string $method 请求类型 - * @return void - */ - public static function checkDomain($request, &$currentRules, $method = 'get') - { - // 域名规则 - $rules = self::$rules['domain']; - // 开启子域名部署 支持二级和三级域名 - if (!empty($rules)) { - $host = $request->host(); - if (isset($rules[$host])) { - // 完整域名或者IP配置 - $item = $rules[$host]; - } else { - $rootDomain = Config::get('url_domain_root'); - if ($rootDomain) { - // 配置域名根 例如 thinkphp.cn 163.com.cn 如果是国家级域名 com.cn net.cn 之类的域名需要配置 - $domain = explode('.', rtrim(stristr($host, $rootDomain, true), '.')); - } else { - $domain = explode('.', $host, -2); - } - // 子域名配置 - if (!empty($domain)) { - // 当前子域名 - $subDomain = implode('.', $domain); - self::$subDomain = $subDomain; - $domain2 = array_pop($domain); - if ($domain) { - // 存在三级域名 - $domain3 = array_pop($domain); - } - if ($subDomain && isset($rules[$subDomain])) { - // 子域名配置 - $item = $rules[$subDomain]; - } elseif (isset($rules['*.' . $domain2]) && !empty($domain3)) { - // 泛三级域名 - $item = $rules['*.' . $domain2]; - $panDomain = $domain3; - } elseif (isset($rules['*']) && !empty($domain2)) { - // 泛二级域名 - if ('www' != $domain2) { - $item = $rules['*']; - $panDomain = $domain2; - } - } - } - } - if (!empty($item)) { - if (isset($item['[bind]'])) { - // 解析子域名部署规则 - list($rule, $option, $pattern) = $item['[bind]']; - if (!empty($option['https']) && !$request->isSsl()) { - // https检测 - throw new HttpException(404, 'must use https request:' . $host); - } - - if (strpos($rule, '?')) { - // 传入其它参数 - $array = parse_url($rule); - $result = $array['path']; - parse_str($array['query'], $params); - if (isset($panDomain)) { - $pos = array_search('*', $params); - if (false !== $pos) { - // 泛域名作为参数 - $params[$pos] = $panDomain; - } - } - $_GET = array_merge($_GET, $params); - } else { - $result = $rule; - } - - if (0 === strpos($result, '\\')) { - // 绑定到命名空间 例如 \app\index\behavior - self::$bind = ['type' => 'namespace', 'namespace' => $result]; - } elseif (0 === strpos($result, '@')) { - // 绑定到类 例如 @app\index\controller\User - self::$bind = ['type' => 'class', 'class' => substr($result, 1)]; - } else { - // 绑定到模块/控制器 例如 index/user - self::$bind = ['type' => 'module', 'module' => $result]; - } - self::$domainBind = true; - } else { - self::$domainRule = $item; - $currentRules = isset($item[$method]) ? $item[$method] : $item['*']; - } - } - } - } - - /** - * 检测URL路由 - * @access public - * @param Request $request Request请求对象 - * @param string $url URL地址 - * @param string $depr URL分隔符 - * @param bool $checkDomain 是否检测域名规则 - * @return false|array - */ - public static function check($request, $url, $depr = '/', $checkDomain = false) - { - // 分隔符替换 确保路由定义使用统一的分隔符 - $url = str_replace($depr, '|', $url); - - if (strpos($url, '|') && isset(self::$rules['alias'][strstr($url, '|', true)])) { - // 检测路由别名 - $result = self::checkRouteAlias($request, $url, $depr); - if (false !== $result) { - return $result; - } - } - $method = strtolower($request->method()); - // 获取当前请求类型的路由规则 - $rules = self::$rules[$method]; - // 检测域名部署 - if ($checkDomain) { - self::checkDomain($request, $rules, $method); - } - // 检测URL绑定 - $return = self::checkUrlBind($url, $rules, $depr); - if (false !== $return) { - return $return; - } - if ('|' != $url) { - $url = rtrim($url, '|'); - } - $item = str_replace('|', '/', $url); - if (isset($rules[$item])) { - // 静态路由规则检测 - $rule = $rules[$item]; - if (true === $rule) { - $rule = self::getRouteExpress($item); - } - if (!empty($rule['route']) && self::checkOption($rule['option'], $request)) { - self::setOption($rule['option']); - return self::parseRule($item, $rule['route'], $url, $rule['option']); - } - } - - // 路由规则检测 - if (!empty($rules)) { - return self::checkRoute($request, $rules, $url, $depr); - } - return false; - } - - private static function getRouteExpress($key) - { - return self::$domainRule ? self::$domainRule['*'][$key] : self::$rules['*'][$key]; - } - - /** - * 检测路由规则 - * @access private - * @param Request $request - * @param array $rules 路由规则 - * @param string $url URL地址 - * @param string $depr URL分割符 - * @param string $group 路由分组名 - * @param array $options 路由参数(分组) - * @return mixed - */ - private static function checkRoute($request, $rules, $url, $depr = '/', $group = '', $options = []) - { - foreach ($rules as $key => $item) { - if (true === $item) { - $item = self::getRouteExpress($key); - } - if (!isset($item['rule'])) { - continue; - } - $rule = $item['rule']; - $route = $item['route']; - $vars = $item['var']; - $option = $item['option']; - $pattern = $item['pattern']; - - // 检查参数有效性 - if (!self::checkOption($option, $request)) { - continue; - } - - if (isset($option['ext'])) { - // 路由ext参数 优先于系统配置的URL伪静态后缀参数 - $url = preg_replace('/\.' . $request->ext() . '$/i', '', $url); - } - - if (is_array($rule)) { - // 分组路由 - $pos = strpos(str_replace('<', ':', $key), ':'); - if (false !== $pos) { - $str = substr($key, 0, $pos); - } else { - $str = $key; - } - if (is_string($str) && $str && 0 !== strpos(str_replace('|', '/', $url), $str)) { - continue; - } - self::setOption($option); - $result = self::checkRoute($request, $rule, $url, $depr, $key, $option); - if (false !== $result) { - return $result; - } - } elseif ($route) { - if ('__miss__' == $rule || '__auto__' == $rule) { - // 指定特殊路由 - $var = trim($rule, '__'); - ${$var} = $item; - continue; - } - if ($group) { - $rule = $group . ($rule ? '/' . ltrim($rule, '/') : ''); - } - - self::setOption($option); - if (isset($options['bind_model']) && isset($option['bind_model'])) { - $option['bind_model'] = array_merge($options['bind_model'], $option['bind_model']); - } - $result = self::checkRule($rule, $route, $url, $pattern, $option, $depr); - if (false !== $result) { - return $result; - } - } - } - if (isset($auto)) { - // 自动解析URL地址 - return self::parseUrl($auto['route'] . '/' . $url, $depr); - } elseif (isset($miss)) { - // 未匹配所有路由的路由规则处理 - return self::parseRule('', $miss['route'], $url, $miss['option']); - } - return false; - } - - /** - * 检测路由别名 - * @access private - * @param Request $request - * @param string $url URL地址 - * @param string $depr URL分隔符 - * @return mixed - */ - private static function checkRouteAlias($request, $url, $depr) - { - $array = explode('|', $url); - $alias = array_shift($array); - $item = self::$rules['alias'][$alias]; - - if (is_array($item)) { - list($rule, $option) = $item; - $action = $array[0]; - if (isset($option['allow']) && !in_array($action, explode(',', $option['allow']))) { - // 允许操作 - return false; - } elseif (isset($option['except']) && in_array($action, explode(',', $option['except']))) { - // 排除操作 - return false; - } - if (isset($option['method'][$action])) { - $option['method'] = $option['method'][$action]; - } - } else { - $rule = $item; - } - $bind = implode('|', $array); - // 参数有效性检查 - if (isset($option) && !self::checkOption($option, $request)) { - // 路由不匹配 - return false; - } elseif (0 === strpos($rule, '\\')) { - // 路由到类 - return self::bindToClass($bind, substr($rule, 1), $depr); - } elseif (0 === strpos($rule, '@')) { - // 路由到控制器类 - return self::bindToController($bind, substr($rule, 1), $depr); - } else { - // 路由到模块/控制器 - return self::bindToModule($bind, $rule, $depr); - } - } - - /** - * 检测URL绑定 - * @access private - * @param string $url URL地址 - * @param array $rules 路由规则 - * @param string $depr URL分隔符 - * @return mixed - */ - private static function checkUrlBind(&$url, &$rules, $depr = '/') - { - if (!empty(self::$bind)) { - $type = self::$bind['type']; - $bind = self::$bind[$type]; - // 记录绑定信息 - App::$debug && Log::record('[ BIND ] ' . var_export($bind, true), 'info'); - // 如果有URL绑定 则进行绑定检测 - switch ($type) { - case 'class': - // 绑定到类 - return self::bindToClass($url, $bind, $depr); - case 'controller': - // 绑定到控制器类 - return self::bindToController($url, $bind, $depr); - case 'namespace': - // 绑定到命名空间 - return self::bindToNamespace($url, $bind, $depr); - } - } - return false; - } - - /** - * 绑定到类 - * @access public - * @param string $url URL地址 - * @param string $class 类名(带命名空间) - * @param string $depr URL分隔符 - * @return array - */ - public static function bindToClass($url, $class, $depr = '/') - { - $url = str_replace($depr, '|', $url); - $array = explode('|', $url, 2); - $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); - if (!empty($array[1])) { - self::parseUrlParams($array[1]); - } - return ['type' => 'method', 'method' => [$class, $action]]; - } - - /** - * 绑定到命名空间 - * @access public - * @param string $url URL地址 - * @param string $namespace 命名空间 - * @param string $depr URL分隔符 - * @return array - */ - public static function bindToNamespace($url, $namespace, $depr = '/') - { - $url = str_replace($depr, '|', $url); - $array = explode('|', $url, 3); - $class = !empty($array[0]) ? $array[0] : Config::get('default_controller'); - $method = !empty($array[1]) ? $array[1] : Config::get('default_action'); - if (!empty($array[2])) { - self::parseUrlParams($array[2]); - } - return ['type' => 'method', 'method' => [$namespace . '\\' . Loader::parseName($class, 1), $method]]; - } - - /** - * 绑定到控制器类 - * @access public - * @param string $url URL地址 - * @param string $controller 控制器名 (支持带模块名 index/user ) - * @param string $depr URL分隔符 - * @return array - */ - public static function bindToController($url, $controller, $depr = '/') - { - $url = str_replace($depr, '|', $url); - $array = explode('|', $url, 2); - $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); - if (!empty($array[1])) { - self::parseUrlParams($array[1]); - } - return ['type' => 'controller', 'controller' => $controller . '/' . $action]; - } - - /** - * 绑定到模块/控制器 - * @access public - * @param string $url URL地址 - * @param string $class 控制器类名(带命名空间) - * @param string $depr URL分隔符 - * @return array - */ - public static function bindToModule($url, $controller, $depr = '/') - { - $url = str_replace($depr, '|', $url); - $array = explode('|', $url, 2); - $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); - if (!empty($array[1])) { - self::parseUrlParams($array[1]); - } - return ['type' => 'module', 'module' => $controller . '/' . $action]; - } - - /** - * 路由参数有效性检查 - * @access private - * @param array $option 路由参数 - * @param Request $request Request对象 - * @return bool - */ - private static function checkOption($option, $request) - { - if ((isset($option['method']) && is_string($option['method']) && false === stripos($option['method'], $request->method())) - || (isset($option['ajax']) && $option['ajax'] && !$request->isAjax()) // Ajax检测 - || (isset($option['ajax']) && !$option['ajax'] && $request->isAjax()) // 非Ajax检测 - || (isset($option['pjax']) && $option['pjax'] && !$request->isPjax()) // Pjax检测 - || (isset($option['pjax']) && !$option['pjax'] && $request->isPjax()) // 非Pjax检测 - || (isset($option['ext']) && false === stripos($option['ext'], $request->ext())) // 伪静态后缀检测 - || (isset($option['deny_ext']) && false !== stripos($option['deny_ext'], $request->ext())) - || (isset($option['domain']) && !in_array($option['domain'], [$_SERVER['HTTP_HOST'], self::$subDomain])) // 域名检测 - || (isset($option['https']) && $option['https'] && !$request->isSsl()) // https检测 - || (isset($option['https']) && !$option['https'] && $request->isSsl()) // https检测 - || (!empty($option['before_behavior']) && false === Hook::exec($option['before_behavior'])) // 行为检测 - || (!empty($option['callback']) && is_callable($option['callback']) && false === call_user_func($option['callback'])) // 自定义检测 - ) { - return false; - } - return true; - } - - /** - * 检测路由规则 - * @access private - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param string $url URL地址 - * @param array $pattern 变量规则 - * @param array $option 路由参数 - * @param string $depr URL分隔符(全局) - * @return array|false - */ - private static function checkRule($rule, $route, $url, $pattern, $option, $depr) - { - // 检查完整规则定义 - if (isset($pattern['__url__']) && !preg_match('/^' . $pattern['__url__'] . '/', str_replace('|', $depr, $url))) { - return false; - } - // 检查路由的参数分隔符 - if (isset($option['param_depr'])) { - $url = str_replace(['|', $option['param_depr']], [$depr, '|'], $url); - } - - $len1 = substr_count($url, '|'); - $len2 = substr_count($rule, '/'); - // 多余参数是否合并 - $merge = !empty($option['merge_extra_vars']) ? true : false; - if ($merge && $len1 > $len2) { - $url = str_replace('|', $depr, $url); - $url = implode('|', explode($depr, $url, $len2 + 1)); - } - - if ($len1 >= $len2 || strpos($rule, '[')) { - if (!empty($option['complete_match'])) { - // 完整匹配 - if (!$merge && $len1 != $len2 && (false === strpos($rule, '[') || $len1 > $len2 || $len1 < $len2 - substr_count($rule, '['))) { - return false; - } - } - $pattern = array_merge(self::$rules['pattern'], $pattern); - if (false !== $match = self::match($url, $rule, $pattern, $merge)) { - // 匹配到路由规则 - return self::parseRule($rule, $route, $url, $option, $match, $merge); - } - } - return false; - } - - /** - * 解析模块的URL地址 [模块/控制器/操作?]参数1=值1&参数2=值2... - * @access public - * @param string $url URL地址 - * @param string $depr URL分隔符 - * @param bool $autoSearch 是否自动深度搜索控制器 - * @return array - */ - public static function parseUrl($url, $depr = '/', $autoSearch = false) - { - - if (isset(self::$bind['module'])) { - $bind = str_replace('/', $depr, self::$bind['module']); - // 如果有模块/控制器绑定 - $url = $bind . ('.' != substr($bind, -1) ? $depr : '') . ltrim($url, $depr); - } - $url = str_replace($depr, '|', $url); - list($path, $var) = self::parseUrlPath($url); - $route = [null, null, null]; - if (isset($path)) { - // 解析模块 - $module = Config::get('app_multi_module') ? array_shift($path) : null; - if ($autoSearch) { - // 自动搜索控制器 - $dir = APP_PATH . ($module ? $module . DS : '') . Config::get('url_controller_layer'); - $suffix = App::$suffix || Config::get('controller_suffix') ? ucfirst(Config::get('url_controller_layer')) : ''; - $item = []; - $find = false; - foreach ($path as $val) { - $item[] = $val; - $file = $dir . DS . str_replace('.', DS, $val) . $suffix . EXT; - $file = pathinfo($file, PATHINFO_DIRNAME) . DS . Loader::parseName(pathinfo($file, PATHINFO_FILENAME), 1) . EXT; - if (is_file($file)) { - $find = true; - break; - } else { - $dir .= DS . $val; - } - } - if ($find) { - $controller = implode('.', $item); - $path = array_slice($path, count($item)); - } else { - $controller = array_shift($path); - } - } else { - // 解析控制器 - $controller = !empty($path) ? array_shift($path) : null; - } - // 解析操作 - $action = !empty($path) ? array_shift($path) : null; - // 解析额外参数 - self::parseUrlParams(empty($path) ? '' : implode('|', $path)); - // 封装路由 - $route = [$module, $controller, $action]; - // 检查地址是否被定义过路由 - $name = strtolower($module . '/' . Loader::parseName($controller, 1) . '/' . $action); - $name2 = ''; - if (empty($module) || isset($bind) && $module == $bind) { - $name2 = strtolower(Loader::parseName($controller, 1) . '/' . $action); - } - - if (isset(self::$rules['name'][$name]) || isset(self::$rules['name'][$name2])) { - throw new HttpException(404, 'invalid request:' . str_replace('|', $depr, $url)); - } - } - return ['type' => 'module', 'module' => $route]; - } - - /** - * 解析URL的pathinfo参数和变量 - * @access private - * @param string $url URL地址 - * @return array - */ - private static function parseUrlPath($url) - { - // 分隔符替换 确保路由定义使用统一的分隔符 - $url = str_replace('|', '/', $url); - $url = trim($url, '/'); - $var = []; - if (false !== strpos($url, '?')) { - // [模块/控制器/操作?]参数1=值1&参数2=值2... - $info = parse_url($url); - $path = explode('/', $info['path']); - parse_str($info['query'], $var); - } elseif (strpos($url, '/')) { - // [模块/控制器/操作] - $path = explode('/', $url); - } elseif (false !== strpos($url, '=')) { - // 参数1=值1&参数2=值2... - parse_str($url, $var); - } else { - $path = [$url]; - } - return [$path, $var]; - } - - /** - * 检测URL和规则路由是否匹配 - * @access private - * @param string $url URL地址 - * @param string $rule 路由规则 - * @param array $pattern 变量规则 - * @return array|false - */ - private static function match($url, $rule, $pattern) - { - $m2 = explode('/', $rule); - $m1 = explode('|', $url); - - $var = []; - foreach ($m2 as $key => $val) { - // val中定义了多个变量 <id><name> - if (false !== strpos($val, '<') && preg_match_all('/<(\w+(\??))>/', $val, $matches)) { - $value = []; - $replace = []; - foreach ($matches[1] as $name) { - if (strpos($name, '?')) { - $name = substr($name, 0, -1); - $replace[] = '(' . (isset($pattern[$name]) ? $pattern[$name] : '\w+') . ')?'; - } else { - $replace[] = '(' . (isset($pattern[$name]) ? $pattern[$name] : '\w+') . ')'; - } - $value[] = $name; - } - $val = str_replace($matches[0], $replace, $val); - if (preg_match('/^' . $val . '$/', isset($m1[$key]) ? $m1[$key] : '', $match)) { - array_shift($match); - foreach ($value as $k => $name) { - if (isset($match[$k])) { - $var[$name] = $match[$k]; - } - } - continue; - } else { - return false; - } - } - - if (0 === strpos($val, '[:')) { - // 可选参数 - $val = substr($val, 1, -1); - $optional = true; - } else { - $optional = false; - } - if (0 === strpos($val, ':')) { - // URL变量 - $name = substr($val, 1); - if (!$optional && !isset($m1[$key])) { - return false; - } - if (isset($m1[$key]) && isset($pattern[$name])) { - // 检查变量规则 - if ($pattern[$name] instanceof \Closure) { - $result = call_user_func_array($pattern[$name], [$m1[$key]]); - if (false === $result) { - return false; - } - } elseif (!preg_match('/^' . $pattern[$name] . '$/', $m1[$key])) { - return false; - } - } - $var[$name] = isset($m1[$key]) ? $m1[$key] : ''; - } elseif (!isset($m1[$key]) || 0 !== strcasecmp($val, $m1[$key])) { - return false; - } - } - // 成功匹配后返回URL中的动态变量数组 - return $var; - } - - /** - * 解析规则路由 - * @access private - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param string $pathinfo URL地址 - * @param array $option 路由参数 - * @param array $matches 匹配的变量 - * @return array - */ - private static function parseRule($rule, $route, $pathinfo, $option = [], $matches = []) - { - $request = Request::instance(); - // 解析路由规则 - if ($rule) { - $rule = explode('/', $rule); - // 获取URL地址中的参数 - $paths = explode('|', $pathinfo); - foreach ($rule as $item) { - $fun = ''; - if (0 === strpos($item, '[:')) { - $item = substr($item, 1, -1); - } - if (0 === strpos($item, ':')) { - $var = substr($item, 1); - $matches[$var] = array_shift($paths); - } else { - // 过滤URL中的静态变量 - array_shift($paths); - } - } - } else { - $paths = explode('|', $pathinfo); - } - - // 获取路由地址规则 - if (is_string($route) && isset($option['prefix'])) { - // 路由地址前缀 - $route = $option['prefix'] . $route; - } - // 替换路由地址中的变量 - if (is_string($route) && !empty($matches)) { - foreach ($matches as $key => $val) { - if (false !== strpos($route, ':' . $key)) { - $route = str_replace(':' . $key, $val, $route); - } - } - } - - // 绑定模型数据 - if (isset($option['bind_model'])) { - $bind = []; - foreach ($option['bind_model'] as $key => $val) { - if ($val instanceof \Closure) { - $result = call_user_func_array($val, [$matches]); - } else { - if (is_array($val)) { - $fields = explode('&', $val[1]); - $model = $val[0]; - $exception = isset($val[2]) ? $val[2] : true; - } else { - $fields = ['id']; - $model = $val; - $exception = true; - } - $where = []; - $match = true; - foreach ($fields as $field) { - if (!isset($matches[$field])) { - $match = false; - break; - } else { - $where[$field] = $matches[$field]; - } - } - if ($match) { - $query = strpos($model, '\\') ? $model::where($where) : Loader::model($model)->where($where); - $result = $query->failException($exception)->find(); - } - } - if (!empty($result)) { - $bind[$key] = $result; - } - } - $request->bind($bind); - } - - // 解析额外参数 - self::parseUrlParams(empty($paths) ? '' : implode('|', $paths), $matches); - // 记录匹配的路由信息 - $request->routeInfo(['rule' => $rule, 'route' => $route, 'option' => $option, 'var' => $matches]); - - // 检测路由after行为 - if (!empty($option['after_behavior'])) { - if ($option['after_behavior'] instanceof \Closure) { - $result = call_user_func_array($option['after_behavior'], []); - } else { - foreach ((array) $option['after_behavior'] as $behavior) { - $result = Hook::exec($behavior, ''); - if (!is_null($result)) { - break; - } - } - } - // 路由规则重定向 - if ($result instanceof Response) { - return ['type' => 'response', 'response' => $result]; - } elseif (is_array($result)) { - return $result; - } - } - - if ($route instanceof \Closure) { - // 执行闭包 - $result = ['type' => 'function', 'function' => $route]; - } elseif (0 === strpos($route, '/') || strpos($route, '://')) { - // 路由到重定向地址 - $result = ['type' => 'redirect', 'url' => $route, 'status' => isset($option['status']) ? $option['status'] : 301]; - } elseif (false !== strpos($route, '\\')) { - // 路由到方法 - $route = str_replace('/', '@', $route); - $method = strpos($route, '@') ? explode('@', $route) : $route; - $result = ['type' => 'method', 'method' => $method]; - } elseif (0 === strpos($route, '@')) { - // 路由到控制器 - $result = ['type' => 'controller', 'controller' => substr($route, 1)]; - } else { - // 路由到模块/控制器/操作 - $result = self::parseModule($route); - } - // 开启请求缓存 - if ($request->isGet() && isset($option['cache'])) { - $cache = $option['cache']; - if (is_array($cache)) { - list($key, $expire) = $cache; - } else { - $key = $pathinfo; - $expire = $cache; - } - $request->cache($key, $expire); - } - return $result; - } - - /** - * 解析URL地址为 模块/控制器/操作 - * @access private - * @param string $url URL地址 - * @return array - */ - private static function parseModule($url) - { - list($path, $var) = self::parseUrlPath($url); - $action = array_pop($path); - $controller = !empty($path) ? array_pop($path) : null; - $module = Config::get('app_multi_module') && !empty($path) ? array_pop($path) : null; - $method = Request::instance()->method(); - if (Config::get('use_action_prefix') && !empty(self::$methodPrefix[$method])) { - // 操作方法前缀支持 - $action = 0 !== strpos($action, self::$methodPrefix[$method]) ? self::$methodPrefix[$method] . $action : $action; - } - // 设置当前请求的路由变量 - Request::instance()->route($var); - // 路由到模块/控制器/操作 - return ['type' => 'module', 'module' => [$module, $controller, $action], 'convert' => false]; - } - - /** - * 解析URL地址中的参数Request对象 - * @access private - * @param string $rule 路由规则 - * @param array $var 变量 - * @return void - */ - private static function parseUrlParams($url, &$var = []) - { - if ($url) { - if (Config::get('url_param_type')) { - $var += explode('|', $url); - } else { - preg_replace_callback('/(\w+)\|([^\|]+)/', function ($match) use (&$var) { - $var[$match[1]] = strip_tags($match[2]); - }, $url); - } - } - // 设置当前请求的参数 - Request::instance()->route($var); - } - - // 分析路由规则中的变量 - private static function parseVar($rule) - { - // 提取路由规则中的变量 - $var = []; - foreach (explode('/', $rule) as $val) { - $optional = false; - if (false !== strpos($val, '<') && preg_match_all('/<(\w+(\??))>/', $val, $matches)) { - foreach ($matches[1] as $name) { - if (strpos($name, '?')) { - $name = substr($name, 0, -1); - $optional = true; - } else { - $optional = false; - } - $var[$name] = $optional ? 2 : 1; - } - } - - if (0 === strpos($val, '[:')) { - // 可选参数 - $optional = true; - $val = substr($val, 1, -1); - } - if (0 === strpos($val, ':')) { - // URL变量 - $name = substr($val, 1); - $var[$name] = $optional ? 2 : 1; - } - } - return $var; - } -} diff --git a/thinkphp/library/think/Session.php b/thinkphp/library/think/Session.php deleted file mode 100755 index ab0bdfa..0000000 --- a/thinkphp/library/think/Session.php +++ /dev/null @@ -1,359 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\App; -use think\exception\ClassNotFoundException; - -class Session -{ - protected static $prefix = ''; - protected static $init = null; - - /** - * 设置或者获取session作用域(前缀) - * @param string $prefix - * @return string|void - */ - public static function prefix($prefix = '') - { - if (empty($prefix) && null !== $prefix) { - return self::$prefix; - } else { - self::$prefix = $prefix; - } - } - - /** - * session初始化 - * @param array $config - * @return void - * @throws \think\Exception - */ - public static function init(array $config = []) - { - if (empty($config)) { - $config = Config::get('session'); - } - // 记录初始化信息 - App::$debug && Log::record('[ SESSION ] INIT ' . var_export($config, true), 'info'); - $isDoStart = false; - if (isset($config['use_trans_sid'])) { - ini_set('session.use_trans_sid', $config['use_trans_sid'] ? 1 : 0); - } - - // 启动session - if (!empty($config['auto_start']) && PHP_SESSION_ACTIVE != session_status()) { - ini_set('session.auto_start', 0); - $isDoStart = true; - } - - if (isset($config['prefix'])) { - self::$prefix = $config['prefix']; - } - if (isset($config['var_session_id']) && isset($_REQUEST[$config['var_session_id']])) { - session_id($_REQUEST[$config['var_session_id']]); - } elseif (isset($config['id']) && !empty($config['id'])) { - session_id($config['id']); - } - if (isset($config['name'])) { - session_name($config['name']); - } - if (isset($config['path'])) { - session_save_path($config['path']); - } - if (isset($config['domain'])) { - ini_set('session.cookie_domain', $config['domain']); - } - if (isset($config['expire'])) { - ini_set('session.gc_maxlifetime', $config['expire']); - ini_set('session.cookie_lifetime', $config['expire']); - } - - if (isset($config['use_cookies'])) { - ini_set('session.use_cookies', $config['use_cookies'] ? 1 : 0); - } - if (isset($config['cache_limiter'])) { - session_cache_limiter($config['cache_limiter']); - } - if (isset($config['cache_expire'])) { - session_cache_expire($config['cache_expire']); - } - if (!empty($config['type'])) { - // 读取session驱动 - $class = false !== strpos($config['type'], '\\') ? $config['type'] : '\\think\\session\\driver\\' . ucwords($config['type']); - - // 检查驱动类 - if (!class_exists($class) || !session_set_save_handler(new $class($config))) { - throw new ClassNotFoundException('error session handler:' . $class, $class); - } - } - if ($isDoStart) { - session_start(); - self::$init = true; - } else { - self::$init = false; - } - } - - /** - * session自动启动或者初始化 - * @return void - */ - public static function boot() - { - if (is_null(self::$init)) { - self::init(); - } elseif (false === self::$init) { - session_start(); - self::$init = true; - } - } - - /** - * session设置 - * @param string $name session名称 - * @param mixed $value session值 - * @param string|null $prefix 作用域(前缀) - * @return void - */ - public static function set($name, $value = '', $prefix = null) - { - empty(self::$init) && self::boot(); - - $prefix = !is_null($prefix) ? $prefix : self::$prefix; - if (strpos($name, '.')) { - // 二维数组赋值 - list($name1, $name2) = explode('.', $name); - if ($prefix) { - $_SESSION[$prefix][$name1][$name2] = $value; - } else { - $_SESSION[$name1][$name2] = $value; - } - } elseif ($prefix) { - $_SESSION[$prefix][$name] = $value; - } else { - $_SESSION[$name] = $value; - } - } - - /** - * session获取 - * @param string $name session名称 - * @param string|null $prefix 作用域(前缀) - * @return mixed - */ - public static function get($name = '', $prefix = null) - { - empty(self::$init) && self::boot(); - $prefix = !is_null($prefix) ? $prefix : self::$prefix; - if ('' == $name) { - // 获取全部的session - $value = $prefix ? (!empty($_SESSION[$prefix]) ? $_SESSION[$prefix] : []) : $_SESSION; - } elseif ($prefix) { - // 获取session - if (strpos($name, '.')) { - list($name1, $name2) = explode('.', $name); - $value = isset($_SESSION[$prefix][$name1][$name2]) ? $_SESSION[$prefix][$name1][$name2] : null; - } else { - $value = isset($_SESSION[$prefix][$name]) ? $_SESSION[$prefix][$name] : null; - } - } else { - if (strpos($name, '.')) { - list($name1, $name2) = explode('.', $name); - $value = isset($_SESSION[$name1][$name2]) ? $_SESSION[$name1][$name2] : null; - } else { - $value = isset($_SESSION[$name]) ? $_SESSION[$name] : null; - } - } - return $value; - } - - /** - * session获取并删除 - * @param string $name session名称 - * @param string|null $prefix 作用域(前缀) - * @return mixed - */ - public static function pull($name, $prefix = null) - { - $result = self::get($name, $prefix); - if ($result) { - self::delete($name, $prefix); - return $result; - } else { - return null; - } - } - - /** - * session设置 下一次请求有效 - * @param string $name session名称 - * @param mixed $value session值 - * @param string|null $prefix 作用域(前缀) - * @return void - */ - public static function flash($name, $value) - { - self::set($name, $value); - if (!self::has('__flash__.__time__')) { - self::set('__flash__.__time__', $_SERVER['REQUEST_TIME_FLOAT']); - } - self::push('__flash__', $name); - } - - /** - * 清空当前请求的session数据 - * @return void - */ - public static function flush() - { - if (self::$init) { - $item = self::get('__flash__'); - - if (!empty($item)) { - $time = $item['__time__']; - if ($_SERVER['REQUEST_TIME_FLOAT'] > $time) { - unset($item['__time__']); - self::delete($item); - self::set('__flash__', []); - } - } - } - } - - /** - * 删除session数据 - * @param string|array $name session名称 - * @param string|null $prefix 作用域(前缀) - * @return void - */ - public static function delete($name, $prefix = null) - { - empty(self::$init) && self::boot(); - $prefix = !is_null($prefix) ? $prefix : self::$prefix; - if (is_array($name)) { - foreach ($name as $key) { - self::delete($key, $prefix); - } - } elseif (strpos($name, '.')) { - list($name1, $name2) = explode('.', $name); - if ($prefix) { - unset($_SESSION[$prefix][$name1][$name2]); - } else { - unset($_SESSION[$name1][$name2]); - } - } else { - if ($prefix) { - unset($_SESSION[$prefix][$name]); - } else { - unset($_SESSION[$name]); - } - } - } - - /** - * 清空session数据 - * @param string|null $prefix 作用域(前缀) - * @return void - */ - public static function clear($prefix = null) - { - empty(self::$init) && self::boot(); - $prefix = !is_null($prefix) ? $prefix : self::$prefix; - if ($prefix) { - unset($_SESSION[$prefix]); - } else { - $_SESSION = []; - } - } - - /** - * 判断session数据 - * @param string $name session名称 - * @param string|null $prefix - * @return bool - */ - public static function has($name, $prefix = null) - { - empty(self::$init) && self::boot(); - $prefix = !is_null($prefix) ? $prefix : self::$prefix; - if (strpos($name, '.')) { - // 支持数组 - list($name1, $name2) = explode('.', $name); - return $prefix ? isset($_SESSION[$prefix][$name1][$name2]) : isset($_SESSION[$name1][$name2]); - } else { - return $prefix ? isset($_SESSION[$prefix][$name]) : isset($_SESSION[$name]); - } - } - - /** - * 添加数据到一个session数组 - * @param string $key - * @param mixed $value - * @return void - */ - public static function push($key, $value) - { - $array = self::get($key); - if (is_null($array)) { - $array = []; - } - $array[] = $value; - self::set($key, $array); - } - - /** - * 启动session - * @return void - */ - public static function start() - { - session_start(); - self::$init = true; - } - - /** - * 销毁session - * @return void - */ - public static function destroy() - { - if (!empty($_SESSION)) { - $_SESSION = []; - } - session_unset(); - session_destroy(); - self::$init = null; - } - - /** - * 重新生成session_id - * @param bool $delete 是否删除关联会话文件 - * @return void - */ - private static function regenerate($delete = false) - { - session_regenerate_id($delete); - } - - /** - * 暂停session - * @return void - */ - public static function pause() - { - // 暂停session - session_write_close(); - self::$init = false; - } -} diff --git a/thinkphp/library/think/Template.php b/thinkphp/library/think/Template.php deleted file mode 100755 index 0c2265c..0000000 --- a/thinkphp/library/think/Template.php +++ /dev/null @@ -1,1144 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\exception\TemplateNotFoundException; - -/** - * ThinkPHP分离出来的模板引擎 - * 支持XML标签和普通标签的模板解析 - * 编译型模板引擎 支持动态缓存 - */ -class Template -{ - // 模板变量 - protected $data = []; - // 引擎配置 - protected $config = [ - 'view_path' => '', // 模板路径 - 'view_suffix' => 'html', // 默认模板文件后缀 - 'view_depr' => DS, - 'cache_suffix' => 'php', // 默认模板缓存后缀 - 'tpl_deny_func_list' => 'echo,exit', // 模板引擎禁用函数 - 'tpl_deny_php' => false, // 默认模板引擎是否禁用PHP原生代码 - 'tpl_begin' => '{', // 模板引擎普通标签开始标记 - 'tpl_end' => '}', // 模板引擎普通标签结束标记 - 'strip_space' => false, // 是否去除模板文件里面的html空格与换行 - 'tpl_cache' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译 - 'compile_type' => 'file', // 模板编译类型 - 'cache_prefix' => '', // 模板缓存前缀标识,可以动态改变 - 'cache_time' => 0, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒) - 'layout_on' => false, // 布局模板开关 - 'layout_name' => 'layout', // 布局模板入口文件 - 'layout_item' => '{__CONTENT__}', // 布局模板的内容替换标识 - 'taglib_begin' => '{', // 标签库标签开始标记 - 'taglib_end' => '}', // 标签库标签结束标记 - 'taglib_load' => true, // 是否使用内置标签库之外的其它标签库,默认自动检测 - 'taglib_build_in' => 'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序 - 'taglib_pre_load' => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔 - 'display_cache' => false, // 模板渲染缓存 - 'cache_id' => '', // 模板缓存ID - 'tpl_replace_string' => [], - 'tpl_var_identify' => 'array', // .语法变量识别,array|object|'', 为空时自动识别 - ]; - - private $literal = []; - private $includeFile = []; // 记录所有模板包含的文件路径及更新时间 - protected $storage; - - /** - * 架构函数 - * @access public - */ - public function __construct(array $config = []) - { - $this->config['cache_path'] = TEMP_PATH; - $this->config = array_merge($this->config, $config); - $this->config['taglib_begin'] = $this->stripPreg($this->config['taglib_begin']); - $this->config['taglib_end'] = $this->stripPreg($this->config['taglib_end']); - $this->config['tpl_begin'] = $this->stripPreg($this->config['tpl_begin']); - $this->config['tpl_end'] = $this->stripPreg($this->config['tpl_end']); - - // 初始化模板编译存储器 - $type = $this->config['compile_type'] ? $this->config['compile_type'] : 'File'; - $class = false !== strpos($type, '\\') ? $type : '\\think\\template\\driver\\' . ucwords($type); - $this->storage = new $class(); - } - - /** - * 字符串替换 避免正则混淆 - * @access private - * @param string $str - * @return string - */ - private function stripPreg($str) - { - return str_replace( - ['{', '}', '(', ')', '|', '[', ']', '-', '+', '*', '.', '^', '?'], - ['\{', '\}', '\(', '\)', '\|', '\[', '\]', '\-', '\+', '\*', '\.', '\^', '\?'], - $str); - } - - /** - * 模板变量赋值 - * @access public - * @param mixed $name - * @param mixed $value - * @return void - */ - public function assign($name, $value = '') - { - if (is_array($name)) { - $this->data = array_merge($this->data, $name); - } else { - $this->data[$name] = $value; - } - } - - /** - * 模板引擎参数赋值 - * @access public - * @param mixed $name - * @param mixed $value - */ - public function __set($name, $value) - { - $this->config[$name] = $value; - } - - /** - * 模板引擎配置项 - * @access public - * @param array|string $config - * @return void|array - */ - public function config($config) - { - if (is_array($config)) { - $this->config = array_merge($this->config, $config); - } elseif (isset($this->config[$config])) { - return $this->config[$config]; - } else { - return null; - } - } - - /** - * 模板变量获取 - * @access public - * @param string $name 变量名 - * @return mixed - */ - public function get($name = '') - { - if ('' == $name) { - return $this->data; - } else { - $data = $this->data; - foreach (explode('.', $name) as $key => $val) { - if (isset($data[$val])) { - $data = $data[$val]; - } else { - $data = null; - break; - } - } - return $data; - } - } - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $vars 模板变量 - * @param array $config 模板参数 - * @return void - */ - public function fetch($template, $vars = [], $config = []) - { - if ($vars) { - $this->data = $vars; - } - if ($config) { - $this->config($config); - } - if (!empty($this->config['cache_id']) && $this->config['display_cache']) { - // 读取渲染缓存 - $cacheContent = Cache::get($this->config['cache_id']); - if (false !== $cacheContent) { - echo $cacheContent; - return; - } - } - $template = $this->parseTemplateFile($template); - if ($template) { - $cacheFile = $this->config['cache_path'] . $this->config['cache_prefix'] . md5($template) . '.' . ltrim($this->config['cache_suffix'], '.'); - if (!$this->checkCache($cacheFile)) { - // 缓存无效 重新模板编译 - $content = file_get_contents($template); - $this->compiler($content, $cacheFile); - } - // 页面缓存 - ob_start(); - ob_implicit_flush(0); - // 读取编译存储 - $this->storage->read($cacheFile, $this->data); - // 获取并清空缓存 - $content = ob_get_clean(); - if (!empty($this->config['cache_id']) && $this->config['display_cache']) { - // 缓存页面输出 - Cache::set($this->config['cache_id'], $content, $this->config['cache_time']); - } - echo $content; - } - } - - /** - * 渲染模板内容 - * @access public - * @param string $content 模板内容 - * @param array $vars 模板变量 - * @param array $config 模板参数 - * @return void - */ - public function display($content, $vars = [], $config = []) - { - if ($vars) { - $this->data = $vars; - } - if ($config) { - $this->config($config); - } - $cacheFile = $this->config['cache_path'] . $this->config['cache_prefix'] . md5($content) . '.' . ltrim($this->config['cache_suffix'], '.'); - if (!$this->checkCache($cacheFile)) { - // 缓存无效 模板编译 - $this->compiler($content, $cacheFile); - } - // 读取编译存储 - $this->storage->read($cacheFile, $this->data); - } - - /** - * 设置布局 - * @access public - * @param mixed $name 布局模板名称 false 则关闭布局 - * @param string $replace 布局模板内容替换标识 - * @return object - */ - public function layout($name, $replace = '') - { - if (false === $name) { - // 关闭布局 - $this->config['layout_on'] = false; - } else { - // 开启布局 - $this->config['layout_on'] = true; - // 名称必须为字符串 - if (is_string($name)) { - $this->config['layout_name'] = $name; - } - if (!empty($replace)) { - $this->config['layout_item'] = $replace; - } - } - return $this; - } - - /** - * 检查编译缓存是否有效 - * 如果无效则需要重新编译 - * @access private - * @param string $cacheFile 缓存文件名 - * @return boolean - */ - private function checkCache($cacheFile) - { - // 未开启缓存功能 - if (!$this->config['tpl_cache']) { - return false; - } - // 缓存文件不存在 - if (!is_file($cacheFile)) { - return false; - } - // 读取缓存文件失败 - if (!$handle = @fopen($cacheFile, "r")) { - return false; - } - // 读取第一行 - preg_match('/\/\*(.+?)\*\//', fgets($handle), $matches); - if (!isset($matches[1])) { - return false; - } - $includeFile = unserialize($matches[1]); - if (!is_array($includeFile)) { - return false; - } - // 检查模板文件是否有更新 - foreach ($includeFile as $path => $time) { - if (is_file($path) && filemtime($path) > $time) { - // 模板文件如果有更新则缓存需要更新 - return false; - } - } - // 检查编译存储是否有效 - return $this->storage->check($cacheFile, $this->config['cache_time']); - } - - /** - * 检查编译缓存是否存在 - * @access public - * @param string $cacheId 缓存的id - * @return boolean - */ - public function isCache($cacheId) - { - if ($cacheId && $this->config['display_cache']) { - // 缓存页面输出 - return Cache::has($cacheId); - } - return false; - } - - /** - * 编译模板文件内容 - * @access private - * @param string $content 模板内容 - * @param string $cacheFile 缓存文件名 - * @return void - */ - private function compiler(&$content, $cacheFile) - { - // 判断是否启用布局 - if ($this->config['layout_on']) { - if (false !== strpos($content, '{__NOLAYOUT__}')) { - // 可以单独定义不使用布局 - $content = str_replace('{__NOLAYOUT__}', '', $content); - } else { - // 读取布局模板 - $layoutFile = $this->parseTemplateFile($this->config['layout_name']); - if ($layoutFile) { - // 替换布局的主体内容 - $content = str_replace($this->config['layout_item'], $content, file_get_contents($layoutFile)); - } - } - } else { - $content = str_replace('{__NOLAYOUT__}', '', $content); - } - - // 模板解析 - $this->parse($content); - if ($this->config['strip_space']) { - /* 去除html空格与换行 */ - $find = ['~>\s+<~', '~>(\s+\n|\r)~']; - $replace = ['><', '>']; - $content = preg_replace($find, $replace, $content); - } - // 优化生成的php代码 - $content = preg_replace('/\?>\s*<\?php\s(?!echo\b)/s', '', $content); - // 模板过滤输出 - $replace = $this->config['tpl_replace_string']; - $content = str_replace(array_keys($replace), array_values($replace), $content); - // 添加安全代码及模板引用记录 - $content = '<?php if (!defined(\'THINK_PATH\')) exit(); /*' . serialize($this->includeFile) . '*/ ?>' . "\n" . $content; - // 编译存储 - $this->storage->write($cacheFile, $content); - $this->includeFile = []; - return; - } - - /** - * 模板解析入口 - * 支持普通标签和TagLib解析 支持自定义标签库 - * @access public - * @param string $content 要解析的模板内容 - * @return void - */ - public function parse(&$content) - { - // 内容为空不解析 - if (empty($content)) { - return; - } - // 替换literal标签内容 - $this->parseLiteral($content); - // 解析继承 - $this->parseExtend($content); - // 解析布局 - $this->parseLayout($content); - // 检查include语法 - $this->parseInclude($content); - // 替换包含文件中literal标签内容 - $this->parseLiteral($content); - // 检查PHP语法 - $this->parsePhp($content); - - // 获取需要引入的标签库列表 - // 标签库只需要定义一次,允许引入多个一次 - // 一般放在文件的最前面 - // 格式:<taglib name="html,mytag..." /> - // 当TAGLIB_LOAD配置为true时才会进行检测 - if ($this->config['taglib_load']) { - $tagLibs = $this->getIncludeTagLib($content); - if (!empty($tagLibs)) { - // 对导入的TagLib进行解析 - foreach ($tagLibs as $tagLibName) { - $this->parseTagLib($tagLibName, $content); - } - } - } - // 预先加载的标签库 无需在每个模板中使用taglib标签加载 但必须使用标签库XML前缀 - if ($this->config['taglib_pre_load']) { - $tagLibs = explode(',', $this->config['taglib_pre_load']); - foreach ($tagLibs as $tag) { - $this->parseTagLib($tag, $content); - } - } - // 内置标签库 无需使用taglib标签导入就可以使用 并且不需使用标签库XML前缀 - $tagLibs = explode(',', $this->config['taglib_build_in']); - foreach ($tagLibs as $tag) { - $this->parseTagLib($tag, $content, true); - } - // 解析普通模板标签 {$tagName} - $this->parseTag($content); - - // 还原被替换的Literal标签 - $this->parseLiteral($content, true); - return; - } - - /** - * 检查PHP语法 - * @access private - * @param string $content 要解析的模板内容 - * @return void - * @throws \think\Exception - */ - private function parsePhp(&$content) - { - // 短标签的情况要将<?标签用echo方式输出 否则无法正常输出xml标识 - $content = preg_replace('/(<\?(?!php|=|$))/i', '<?php echo \'\\1\'; ?>' . "\n", $content); - // PHP语法检查 - if ($this->config['tpl_deny_php'] && false !== strpos($content, '<?php')) { - throw new Exception('not allow php tag', 11600); - } - return; - } - - /** - * 解析模板中的布局标签 - * @access private - * @param string $content 要解析的模板内容 - * @return void - */ - private function parseLayout(&$content) - { - // 读取模板中的布局标签 - if (preg_match($this->getRegex('layout'), $content, $matches)) { - // 替换Layout标签 - $content = str_replace($matches[0], '', $content); - // 解析Layout标签 - $array = $this->parseAttr($matches[0]); - if (!$this->config['layout_on'] || $this->config['layout_name'] != $array['name']) { - // 读取布局模板 - $layoutFile = $this->parseTemplateFile($array['name']); - if ($layoutFile) { - $replace = isset($array['replace']) ? $array['replace'] : $this->config['layout_item']; - // 替换布局的主体内容 - $content = str_replace($replace, $content, file_get_contents($layoutFile)); - } - } - } else { - $content = str_replace('{__NOLAYOUT__}', '', $content); - } - return; - } - - /** - * 解析模板中的include标签 - * @access private - * @param string $content 要解析的模板内容 - * @return void - */ - private function parseInclude(&$content) - { - $regex = $this->getRegex('include'); - $func = function ($template) use (&$func, &$regex, &$content) { - if (preg_match_all($regex, $template, $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - $array = $this->parseAttr($match[0]); - $file = $array['file']; - unset($array['file']); - // 分析模板文件名并读取内容 - $parseStr = $this->parseTemplateName($file); - foreach ($array as $k => $v) { - // 以$开头字符串转换成模板变量 - if (0 === strpos($v, '$')) { - $v = $this->get(substr($v, 1)); - } - $parseStr = str_replace('[' . $k . ']', $v, $parseStr); - } - $content = str_replace($match[0], $parseStr, $content); - // 再次对包含文件进行模板分析 - $func($parseStr); - } - unset($matches); - } - }; - // 替换模板中的include标签 - $func($content); - return; - } - - /** - * 解析模板中的extend标签 - * @access private - * @param string $content 要解析的模板内容 - * @return void - */ - private function parseExtend(&$content) - { - $regex = $this->getRegex('extend'); - $array = $blocks = $baseBlocks = []; - $extend = ''; - $func = function ($template) use (&$func, &$regex, &$array, &$extend, &$blocks, &$baseBlocks) { - if (preg_match($regex, $template, $matches)) { - if (!isset($array[$matches['name']])) { - $array[$matches['name']] = 1; - // 读取继承模板 - $extend = $this->parseTemplateName($matches['name']); - // 递归检查继承 - $func($extend); - // 取得block标签内容 - $blocks = array_merge($blocks, $this->parseBlock($template)); - return; - } - } else { - // 取得顶层模板block标签内容 - $baseBlocks = $this->parseBlock($template, true); - if (empty($extend)) { - // 无extend标签但有block标签的情况 - $extend = $template; - } - } - }; - - $func($content); - if (!empty($extend)) { - if ($baseBlocks) { - $children = []; - foreach ($baseBlocks as $name => $val) { - $replace = $val['content']; - if (!empty($children[$name])) { - // 如果包含有子block标签 - foreach ($children[$name] as $key) { - $replace = str_replace($baseBlocks[$key]['begin'] . $baseBlocks[$key]['content'] . $baseBlocks[$key]['end'], $blocks[$key]['content'], $replace); - } - } - if (isset($blocks[$name])) { - // 带有{__block__}表示与所继承模板的相应标签合并,而不是覆盖 - $replace = str_replace(['{__BLOCK__}', '{__block__}'], $replace, $blocks[$name]['content']); - if (!empty($val['parent'])) { - // 如果不是最顶层的block标签 - $parent = $val['parent']; - if (isset($blocks[$parent])) { - $blocks[$parent]['content'] = str_replace($blocks[$name]['begin'] . $blocks[$name]['content'] . $blocks[$name]['end'], $replace, $blocks[$parent]['content']); - } - $blocks[$name]['content'] = $replace; - $children[$parent][] = $name; - continue; - } - } elseif (!empty($val['parent'])) { - // 如果子标签没有被继承则用原值 - $children[$val['parent']][] = $name; - $blocks[$name] = $val; - } - if (!$val['parent']) { - // 替换模板中的顶级block标签 - $extend = str_replace($val['begin'] . $val['content'] . $val['end'], $replace, $extend); - } - } - } - $content = $extend; - unset($blocks, $baseBlocks); - } - return; - } - - /** - * 替换页面中的literal标签 - * @access private - * @param string $content 模板内容 - * @param boolean $restore 是否为还原 - * @return void - */ - private function parseLiteral(&$content, $restore = false) - { - $regex = $this->getRegex($restore ? 'restoreliteral' : 'literal'); - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) { - if (!$restore) { - $count = count($this->literal); - // 替换literal标签 - foreach ($matches as $match) { - $this->literal[] = substr($match[0], strlen($match[1]), -strlen($match[2])); - $content = str_replace($match[0], "<!--###literal{$count}###-->", $content); - $count++; - } - } else { - // 还原literal标签 - foreach ($matches as $match) { - $content = str_replace($match[0], $this->literal[$match[1]], $content); - } - // 清空literal记录 - $this->literal = []; - } - unset($matches); - } - return; - } - - /** - * 获取模板中的block标签 - * @access private - * @param string $content 模板内容 - * @param boolean $sort 是否排序 - * @return array - */ - private function parseBlock(&$content, $sort = false) - { - $regex = $this->getRegex('block'); - $result = []; - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { - $right = $keys = []; - foreach ($matches as $match) { - if (empty($match['name'][0])) { - if (count($right) > 0) { - $tag = array_pop($right); - $start = $tag['offset'] + strlen($tag['tag']); - $length = $match[0][1] - $start; - $result[$tag['name']] = [ - 'begin' => $tag['tag'], - 'content' => substr($content, $start, $length), - 'end' => $match[0][0], - 'parent' => count($right) ? end($right)['name'] : '', - ]; - $keys[$tag['name']] = $match[0][1]; - } - } else { - // 标签头压入栈 - $right[] = [ - 'name' => $match[2][0], - 'offset' => $match[0][1], - 'tag' => $match[0][0], - ]; - } - } - unset($right, $matches); - if ($sort) { - // 按block标签结束符在模板中的位置排序 - array_multisort($keys, $result); - } - } - return $result; - } - - /** - * 搜索模板页面中包含的TagLib库 - * 并返回列表 - * @access private - * @param string $content 模板内容 - * @return array|null - */ - private function getIncludeTagLib(&$content) - { - // 搜索是否有TagLib标签 - if (preg_match($this->getRegex('taglib'), $content, $matches)) { - // 替换TagLib标签 - $content = str_replace($matches[0], '', $content); - return explode(',', $matches['name']); - } - return null; - } - - /** - * TagLib库解析 - * @access public - * @param string $tagLib 要解析的标签库 - * @param string $content 要解析的模板内容 - * @param boolean $hide 是否隐藏标签库前缀 - * @return void - */ - public function parseTagLib($tagLib, &$content, $hide = false) - { - if (false !== strpos($tagLib, '\\')) { - // 支持指定标签库的命名空间 - $className = $tagLib; - $tagLib = substr($tagLib, strrpos($tagLib, '\\') + 1); - } else { - $className = '\\think\\template\\taglib\\' . ucwords($tagLib); - } - $tLib = new $className($this); - $tLib->parseTag($content, $hide ? '' : $tagLib); - return; - } - - /** - * 分析标签属性 - * @access public - * @param string $str 属性字符串 - * @param string $name 不为空时返回指定的属性名 - * @return array - */ - public function parseAttr($str, $name = null) - { - $regex = '/\s+(?>(?P<name>[\w-]+)\s*)=(?>\s*)([\"\'])(?P<value>(?:(?!\\2).)*)\\2/is'; - $array = []; - if (preg_match_all($regex, $str, $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - $array[$match['name']] = $match['value']; - } - unset($matches); - } - if (!empty($name) && isset($array[$name])) { - return $array[$name]; - } else { - return $array; - } - } - - /** - * 模板标签解析 - * 格式: {TagName:args [|content] } - * @access private - * @param string $content 要解析的模板内容 - * @return void - */ - private function parseTag(&$content) - { - $regex = $this->getRegex('tag'); - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - $str = stripslashes($match[1]); - $flag = substr($str, 0, 1); - switch ($flag) { - case '$': - // 解析模板变量 格式 {$varName} - // 是否带有?号 - if (false !== $pos = strpos($str, '?')) { - $array = preg_split('/([!=]={1,2}|(?<!-)[><]={0,1})/', substr($str, 0, $pos), 2, PREG_SPLIT_DELIM_CAPTURE); - $name = $array[0]; - $this->parseVar($name); - $this->parseVarFunction($name); - - $str = trim(substr($str, $pos + 1)); - $this->parseVar($str); - $first = substr($str, 0, 1); - if (strpos($name, ')')) { - // $name为对象或是自动识别,或者含有函数 - if (isset($array[1])) { - $this->parseVar($array[2]); - $name .= $array[1] . $array[2]; - } - switch ($first) { - case '?': - $str = '<?php echo (' . $name . ') ? ' . $name . ' : ' . substr($str, 1) . '; ?>'; - break; - case '=': - $str = '<?php if(' . $name . ') echo ' . substr($str, 1) . '; ?>'; - break; - default: - $str = '<?php echo ' . $name . '?' . $str . '; ?>'; - } - } else { - if (isset($array[1])) { - $this->parseVar($array[2]); - $_name = ' && ' . $name . $array[1] . $array[2]; - } else { - $_name = ''; - } - // $name为数组 - switch ($first) { - case '?': - // {$varname??'xxx'} $varname有定义则输出$varname,否则输出xxx - $str = '<?php echo isset(' . $name . ')' . $_name . ' ? ' . $name . ' : ' . substr($str, 1) . '; ?>'; - break; - case '=': - // {$varname?='xxx'} $varname为真时才输出xxx - $str = '<?php if(!empty(' . $name . ')' . $_name . ') echo ' . substr($str, 1) . '; ?>'; - break; - case ':': - // {$varname?:'xxx'} $varname为真时输出$varname,否则输出xxx - $str = '<?php echo !empty(' . $name . ')' . $_name . '?' . $name . $str . '; ?>'; - break; - default: - if (strpos($str, ':')) { - // {$varname ? 'a' : 'b'} $varname为真时输出a,否则输出b - $str = '<?php echo !empty(' . $name . ')' . $_name . '?' . $str . '; ?>'; - } else { - $str = '<?php echo ' . $_name . '?' . $str . '; ?>'; - } - } - } - } else { - $this->parseVar($str); - $this->parseVarFunction($str); - $str = '<?php echo ' . $str . '; ?>'; - } - break; - case ':': - // 输出某个函数的结果 - $str = substr($str, 1); - $this->parseVar($str); - $str = '<?php echo ' . $str . '; ?>'; - break; - case '~': - // 执行某个函数 - $str = substr($str, 1); - $this->parseVar($str); - $str = '<?php ' . $str . '; ?>'; - break; - case '-': - case '+': - // 输出计算 - $this->parseVar($str); - $str = '<?php echo ' . $str . '; ?>'; - break; - case '/': - // 注释标签 - $flag2 = substr($str, 1, 1); - if ('/' == $flag2 || ('*' == $flag2 && substr(rtrim($str), -2) == '*/')) { - $str = ''; - } - break; - default: - // 未识别的标签直接返回 - $str = $this->config['tpl_begin'] . $str . $this->config['tpl_end']; - break; - } - $content = str_replace($match[0], $str, $content); - } - unset($matches); - } - return; - } - - /** - * 模板变量解析,支持使用函数 - * 格式: {$varname|function1|function2=arg1,arg2} - * @access public - * @param string $varStr 变量数据 - * @return void - */ - public function parseVar(&$varStr) - { - $varStr = trim($varStr); - if (preg_match_all('/\$[a-zA-Z_](?>\w*)(?:[:\.][0-9a-zA-Z_](?>\w*))+/', $varStr, $matches, PREG_OFFSET_CAPTURE)) { - static $_varParseList = []; - while ($matches[0]) { - $match = array_pop($matches[0]); - //如果已经解析过该变量字串,则直接返回变量值 - if (isset($_varParseList[$match[0]])) { - $parseStr = $_varParseList[$match[0]]; - } else { - if (strpos($match[0], '.')) { - $vars = explode('.', $match[0]); - $first = array_shift($vars); - if ('$Think' == $first) { - // 所有以Think.打头的以特殊变量对待 无需模板赋值就可以输出 - $parseStr = $this->parseThinkVar($vars); - } elseif ('$Request' == $first) { - // 获取Request请求对象参数 - $method = array_shift($vars); - if (!empty($vars)) { - $params = implode('.', $vars); - if ('true' != $params) { - $params = '\'' . $params . '\''; - } - } else { - $params = ''; - } - $parseStr = '\think\Request::instance()->' . $method . '(' . $params . ')'; - } else { - switch ($this->config['tpl_var_identify']) { - case 'array': // 识别为数组 - $parseStr = $first . '[\'' . implode('\'][\'', $vars) . '\']'; - break; - case 'obj': // 识别为对象 - $parseStr = $first . '->' . implode('->', $vars); - break; - default: // 自动判断数组或对象 - $parseStr = '(is_array(' . $first . ')?' . $first . '[\'' . implode('\'][\'', $vars) . '\']:' . $first . '->' . implode('->', $vars) . ')'; - } - } - } else { - $parseStr = str_replace(':', '->', $match[0]); - } - $_varParseList[$match[0]] = $parseStr; - } - $varStr = substr_replace($varStr, $parseStr, $match[1], strlen($match[0])); - } - unset($matches); - } - return; - } - - /** - * 对模板中使用了函数的变量进行解析 - * 格式 {$varname|function1|function2=arg1,arg2} - * @access public - * @param string $varStr 变量字符串 - * @return void - */ - public function parseVarFunction(&$varStr) - { - if (false == strpos($varStr, '|')) { - return; - } - static $_varFunctionList = []; - $_key = md5($varStr); - //如果已经解析过该变量字串,则直接返回变量值 - if (isset($_varFunctionList[$_key])) { - $varStr = $_varFunctionList[$_key]; - } else { - $varArray = explode('|', $varStr); - // 取得变量名称 - $name = array_shift($varArray); - // 对变量使用函数 - $length = count($varArray); - // 取得模板禁止使用函数列表 - $template_deny_funs = explode(',', $this->config['tpl_deny_func_list']); - for ($i = 0; $i < $length; $i++) { - $args = explode('=', $varArray[$i], 2); - // 模板函数过滤 - $fun = trim($args[0]); - switch ($fun) { - case 'default': // 特殊模板函数 - if (false === strpos($name, '(')) { - $name = '(isset(' . $name . ') && (' . $name . ' !== \'\')?' . $name . ':' . $args[1] . ')'; - } else { - $name = '(' . $name . ' !== \'\'?' . $name . ':' . $args[1] . ')'; - } - break; - default: // 通用模板函数 - if (!in_array($fun, $template_deny_funs)) { - if (isset($args[1])) { - if (strstr($args[1], '###')) { - $args[1] = str_replace('###', $name, $args[1]); - $name = "$fun($args[1])"; - } else { - $name = "$fun($name,$args[1])"; - } - } else { - if (!empty($args[0])) { - $name = "$fun($name)"; - } - } - } - } - } - $_varFunctionList[$_key] = $name; - $varStr = $name; - } - return; - } - - /** - * 特殊模板变量解析 - * 格式 以 $Think. 打头的变量属于特殊模板变量 - * @access public - * @param array $vars 变量数组 - * @return string - */ - public function parseThinkVar($vars) - { - $type = strtoupper(trim(array_shift($vars))); - $param = implode('.', $vars); - if ($vars) { - switch ($type) { - case 'SERVER': - $parseStr = '\\think\\Request::instance()->server(\'' . $param . '\')'; - break; - case 'GET': - $parseStr = '\\think\\Request::instance()->get(\'' . $param . '\')'; - break; - case 'POST': - $parseStr = '\\think\\Request::instance()->post(\'' . $param . '\')'; - break; - case 'COOKIE': - $parseStr = '\\think\\Cookie::get(\'' . $param . '\')'; - break; - case 'SESSION': - $parseStr = '\\think\\Session::get(\'' . $param . '\')'; - break; - case 'ENV': - $parseStr = '\\think\\Request::instance()->env(\'' . $param . '\')'; - break; - case 'REQUEST': - $parseStr = '\\think\\Request::instance()->request(\'' . $param . '\')'; - break; - case 'CONST': - $parseStr = strtoupper($param); - break; - case 'LANG': - $parseStr = '\\think\\Lang::get(\'' . $param . '\')'; - break; - case 'CONFIG': - $parseStr = '\\think\\Config::get(\'' . $param . '\')'; - break; - default: - $parseStr = '\'\''; - break; - } - } else { - switch ($type) { - case 'NOW': - $parseStr = "date('Y-m-d g:i a',time())"; - break; - case 'VERSION': - $parseStr = 'THINK_VERSION'; - break; - case 'LDELIM': - $parseStr = '\'' . ltrim($this->config['tpl_begin'], '\\') . '\''; - break; - case 'RDELIM': - $parseStr = '\'' . ltrim($this->config['tpl_end'], '\\') . '\''; - break; - default: - if (defined($type)) { - $parseStr = $type; - } else { - $parseStr = ''; - } - } - } - return $parseStr; - } - - /** - * 分析加载的模板文件并读取内容 支持多个模板文件读取 - * @access private - * @param string $templateName 模板文件名 - * @return string - */ - private function parseTemplateName($templateName) - { - $array = explode(',', $templateName); - $parseStr = ''; - foreach ($array as $templateName) { - if (empty($templateName)) { - continue; - } - if (0 === strpos($templateName, '$')) { - //支持加载变量文件名 - $templateName = $this->get(substr($templateName, 1)); - } - $template = $this->parseTemplateFile($templateName); - if ($template) { - // 获取模板文件内容 - $parseStr .= file_get_contents($template); - } - } - return $parseStr; - } - - /** - * 解析模板文件名 - * @access private - * @param string $template 文件名 - * @return string|false - */ - private function parseTemplateFile($template) - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - if (strpos($template, '@')) { - // 跨模块调用模板 - $template = str_replace(['/', ':'], $this->config['view_depr'], $template); - $template = APP_PATH . str_replace('@', '/' . basename($this->config['view_path']) . '/', $template); - } else { - $template = str_replace(['/', ':'], $this->config['view_depr'], $template); - $template = $this->config['view_path'] . $template; - } - $template .= '.' . ltrim($this->config['view_suffix'], '.'); - } - - if (is_file($template)) { - // 记录模板文件的更新时间 - $this->includeFile[$template] = filemtime($template); - return $template; - } else { - throw new TemplateNotFoundException('template not exists:' . $template, $template); - } - } - - /** - * 按标签生成正则 - * @access private - * @param string $tagName 标签名 - * @return string - */ - private function getRegex($tagName) - { - $regex = ''; - if ('tag' == $tagName) { - $begin = $this->config['tpl_begin']; - $end = $this->config['tpl_end']; - if (strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1) { - $regex = $begin . '((?:[\$]{1,2}[a-wA-w_]|[\:\~][\$a-wA-w_]|[+]{2}[\$][a-wA-w_]|[-]{2}[\$][a-wA-w_]|\/[\*\/])(?>[^' . $end . ']*))' . $end; - } else { - $regex = $begin . '((?:[\$]{1,2}[a-wA-w_]|[\:\~][\$a-wA-w_]|[+]{2}[\$][a-wA-w_]|[-]{2}[\$][a-wA-w_]|\/[\*\/])(?>(?:(?!' . $end . ').)*))' . $end; - } - } else { - $begin = $this->config['taglib_begin']; - $end = $this->config['taglib_end']; - $single = strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1 ? true : false; - switch ($tagName) { - case 'block': - if ($single) { - $regex = $begin . '(?:' . $tagName . '\b(?>(?:(?!name=).)*)\bname=([\'\"])(?P<name>[\$\w\-\/\.]+)\\1(?>[^' . $end . ']*)|\/' . $tagName . ')' . $end; - } else { - $regex = $begin . '(?:' . $tagName . '\b(?>(?:(?!name=).)*)\bname=([\'\"])(?P<name>[\$\w\-\/\.]+)\\1(?>(?:(?!' . $end . ').)*)|\/' . $tagName . ')' . $end; - } - break; - case 'literal': - if ($single) { - $regex = '(' . $begin . $tagName . '\b(?>[^' . $end . ']*)' . $end . ')'; - $regex .= '(?:(?>[^' . $begin . ']*)(?>(?!' . $begin . '(?>' . $tagName . '\b[^' . $end . ']*|\/' . $tagName . ')' . $end . ')' . $begin . '[^' . $begin . ']*)*)'; - $regex .= '(' . $begin . '\/' . $tagName . $end . ')'; - } else { - $regex = '(' . $begin . $tagName . '\b(?>(?:(?!' . $end . ').)*)' . $end . ')'; - $regex .= '(?:(?>(?:(?!' . $begin . ').)*)(?>(?!' . $begin . '(?>' . $tagName . '\b(?>(?:(?!' . $end . ').)*)|\/' . $tagName . ')' . $end . ')' . $begin . '(?>(?:(?!' . $begin . ').)*))*)'; - $regex .= '(' . $begin . '\/' . $tagName . $end . ')'; - } - break; - case 'restoreliteral': - $regex = '<!--###literal(\d+)###-->'; - break; - case 'include': - $name = 'file'; - case 'taglib': - case 'layout': - case 'extend': - if (empty($name)) { - $name = 'name'; - } - if ($single) { - $regex = $begin . $tagName . '\b(?>(?:(?!' . $name . '=).)*)\b' . $name . '=([\'\"])(?P<name>[\$\w\-\/\.\:@,\\\\]+)\\1(?>[^' . $end . ']*)' . $end; - } else { - $regex = $begin . $tagName . '\b(?>(?:(?!' . $name . '=).)*)\b' . $name . '=([\'\"])(?P<name>[\$\w\-\/\.\:@,\\\\]+)\\1(?>(?:(?!' . $end . ').)*)' . $end; - } - break; - } - } - return '/' . $regex . '/is'; - } -} diff --git a/thinkphp/library/think/Url.php b/thinkphp/library/think/Url.php deleted file mode 100755 index d873074..0000000 --- a/thinkphp/library/think/Url.php +++ /dev/null @@ -1,321 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\Config; -use think\Loader; -use think\Request; -use think\Route; - -class Url -{ - // 生成URL地址的root - protected static $root; - protected static $bindCheck; - - /** - * URL生成 支持路由反射 - * @param string $url 路由地址 - * @param string|array $vars 参数(支持数组和字符串)a=val&b=val2... ['a'=>'val1', 'b'=>'val2'] - * @param string|bool $suffix 伪静态后缀,默认为true表示获取配置值 - * @param boolean|string $domain 是否显示域名 或者直接传入域名 - * @return string - */ - public static function build($url = '', $vars = '', $suffix = true, $domain = false) - { - if (false === $domain && Route::rules('domain')) { - $domain = true; - } - // 解析URL - if (0 === strpos($url, '[') && $pos = strpos($url, ']')) { - // [name] 表示使用路由命名标识生成URL - $name = substr($url, 1, $pos - 1); - $url = 'name' . substr($url, $pos + 1); - } - if (false === strpos($url, '://') && 0 !== strpos($url, '/')) { - $info = parse_url($url); - $url = !empty($info['path']) ? $info['path'] : ''; - if (isset($info['fragment'])) { - // 解析锚点 - $anchor = $info['fragment']; - if (false !== strpos($anchor, '?')) { - // 解析参数 - list($anchor, $info['query']) = explode('?', $anchor, 2); - } - if (false !== strpos($anchor, '@')) { - // 解析域名 - list($anchor, $domain) = explode('@', $anchor, 2); - } - } elseif (strpos($url, '@') && false === strpos($url, '\\')) { - // 解析域名 - list($url, $domain) = explode('@', $url, 2); - } - } - - // 解析参数 - if (is_string($vars)) { - // aaa=1&bbb=2 转换成数组 - parse_str($vars, $vars); - } - - if ($url) { - $rule = Route::name(isset($name) ? $name : $url . (isset($info['query']) ? '?' . $info['query'] : '')); - if (is_null($rule) && isset($info['query'])) { - $rule = Route::name($url); - // 解析地址里面参数 合并到vars - parse_str($info['query'], $params); - $vars = array_merge($params, $vars); - unset($info['query']); - } - } - if (!empty($rule) && $match = self::getRuleUrl($rule, $vars)) { - // 匹配路由命名标识 - $url = $match[0]; - // 替换可选分隔符 - $url = preg_replace(['/(\W)\?$/', '/(\W)\?/'], ['', '\1'], $url); - if (!empty($match[1])) { - $domain = $match[1]; - } - } elseif (!empty($rule) && isset($name)) { - throw new \InvalidArgumentException('route name not exists:' . $name); - } else { - // 检查别名路由 - $alias = Route::rules('alias'); - if ($alias) { - // 别名路由解析 - foreach ($alias as $key => $val) { - if (is_array($val)) { - $val = $val[0]; - } - if (0 === strpos($url, $val)) { - $url = $key . substr($url, strlen($val)); - break; - } - } - } else { - // 路由标识不存在 直接解析 - $url = self::parseUrl($url, $domain); - } - if (isset($info['query'])) { - // 解析地址里面参数 合并到vars - parse_str($info['query'], $params); - $vars = array_merge($params, $vars); - } - } - - // 检测URL绑定 - if (!self::$bindCheck) { - $type = Route::getBind('type'); - if ($type) { - $bind = Route::getBind($type); - if (0 === strpos($url, $bind)) { - $url = substr($url, strlen($bind) + 1); - } - } - } - // 还原URL分隔符 - $depr = Config::get('pathinfo_depr'); - $url = str_replace('/', $depr, $url); - - // URL后缀 - $suffix = in_array($url, ['/', '']) ? '' : self::parseSuffix($suffix); - // 锚点 - $anchor = !empty($anchor) ? '#' . $anchor : ''; - // 参数组装 - if (!empty($vars)) { - // 添加参数 - if (Config::get('url_common_param')) { - $vars = urldecode(http_build_query($vars)); - $url .= $suffix . '?' . $vars . $anchor; - } else { - $paramType = Config::get('url_param_type'); - foreach ($vars as $var => $val) { - if ('' !== trim($val)) { - if ($paramType) { - $url .= $depr . urlencode($val); - } else { - $url .= $depr . $var . $depr . urlencode($val); - } - } - } - $url .= $suffix . $anchor; - } - } else { - $url .= $suffix . $anchor; - } - // 检测域名 - $domain = self::parseDomain($url, $domain); - // URL组装 - $url = $domain . (self::$root ?: Request::instance()->root()) . '/' . ltrim($url, '/'); - self::$bindCheck = false; - return $url; - } - - // 直接解析URL地址 - protected static function parseUrl($url, &$domain) - { - $request = Request::instance(); - if (0 === strpos($url, '/')) { - // 直接作为路由地址解析 - $url = substr($url, 1); - } elseif (false !== strpos($url, '\\')) { - // 解析到类 - $url = ltrim(str_replace('\\', '/', $url), '/'); - } elseif (0 === strpos($url, '@')) { - // 解析到控制器 - $url = substr($url, 1); - } else { - // 解析到 模块/控制器/操作 - $module = $request->module(); - $domains = Route::rules('domain'); - if (true === $domain && 2 == substr_count($url, '/')) { - $current = $request->host(); - $match = []; - $pos = []; - foreach ($domains as $key => $item) { - if (isset($item['[bind]']) && 0 === strpos($url, $item['[bind]'][0])) { - $pos[$key] = strlen($item['[bind]'][0]) + 1; - $match[] = $key; - $module = ''; - } - } - if ($match) { - $domain = current($match); - foreach ($match as $item) { - if (0 === strpos($current, $item)) { - $domain = $item; - } - } - self::$bindCheck = true; - $url = substr($url, $pos[$domain]); - } - } elseif ($domain) { - if (isset($domains[$domain]['[bind]'][0])) { - $bindModule = $domains[$domain]['[bind]'][0]; - if ($bindModule && !in_array($bindModule[0], ['\\', '@'])) { - $module = ''; - } - } - } - $module = $module ? $module . '/' : ''; - - $controller = Loader::parseName($request->controller()); - if ('' == $url) { - // 空字符串输出当前的 模块/控制器/操作 - $url = $module . $controller . '/' . $request->action(); - } else { - $path = explode('/', $url); - $action = Config::get('url_convert') ? strtolower(array_pop($path)) : array_pop($path); - $controller = empty($path) ? $controller : (Config::get('url_convert') ? Loader::parseName(array_pop($path)) : array_pop($path)); - $module = empty($path) ? $module : array_pop($path) . '/'; - $url = $module . $controller . '/' . $action; - } - } - return $url; - } - - // 检测域名 - protected static function parseDomain(&$url, $domain) - { - if (!$domain) { - return ''; - } - $request = Request::instance(); - $rootDomain = Config::get('url_domain_root'); - if (true === $domain) { - // 自动判断域名 - $domain = $request->host(); - - $domains = Route::rules('domain'); - if ($domains) { - $route_domain = array_keys($domains); - foreach ($route_domain as $domain_prefix) { - if (0 === strpos($domain_prefix, '*.') && strpos($domain, ltrim($domain_prefix, '*.')) !== false) { - foreach ($domains as $key => $rule) { - $rule = is_array($rule) ? $rule[0] : $rule; - if (is_string($rule) && false === strpos($key, '*') && 0 === strpos($url, $rule)) { - $url = ltrim($url, $rule); - $domain = $key; - // 生成对应子域名 - if (!empty($rootDomain)) { - $domain .= $rootDomain; - } - break; - } else if (false !== strpos($key, '*')) { - if (!empty($rootDomain)) { - $domain .= $rootDomain; - } - break; - } - } - } - } - } - - } else { - if (empty($rootDomain)) { - $host = $request->host(); - $rootDomain = substr_count($host, '.') > 1 ? substr(strstr($host, '.'), 1) : $host; - } - if (!strpos($domain, $rootDomain)) { - $domain .= '.' . $rootDomain; - } - } - return ($request->isSsl() ? 'https://' : 'http://') . $domain; - } - - // 解析URL后缀 - protected static function parseSuffix($suffix) - { - if ($suffix) { - $suffix = true === $suffix ? Config::get('url_html_suffix') : $suffix; - if ($pos = strpos($suffix, '|')) { - $suffix = substr($suffix, 0, $pos); - } - } - return (empty($suffix) || 0 === strpos($suffix, '.')) ? $suffix : '.' . $suffix; - } - - // 匹配路由地址 - public static function getRuleUrl($rule, &$vars = []) - { - foreach ($rule as $item) { - list($url, $pattern, $domain) = $item; - if (empty($pattern)) { - return [$url, $domain]; - } - foreach ($pattern as $key => $val) { - if (isset($vars[$key])) { - $url = str_replace(['[:' . $key . ']', '<' . $key . '?>', ':' . $key . '', '<' . $key . '>'], $vars[$key], $url); - unset($vars[$key]); - $result = [$url, $domain]; - } elseif (2 == $val) { - $url = str_replace(['/[:' . $key . ']', '[:' . $key . ']', '<' . $key . '?>'], '', $url); - $result = [$url, $domain]; - } else { - break; - } - } - if (isset($result)) { - return $result; - } - } - return false; - } - - // 指定当前生成URL地址的root - public static function root($root) - { - self::$root = $root; - Request::instance()->root($root); - } -} diff --git a/thinkphp/library/think/Validate.php b/thinkphp/library/think/Validate.php deleted file mode 100755 index fc38d89..0000000 --- a/thinkphp/library/think/Validate.php +++ /dev/null @@ -1,1238 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -use think\File; -use think\Lang; -use think\Request; -use think\Session; - -class Validate -{ - // 实例 - protected static $instance; - - // 自定义的验证类型 - protected static $type = []; - - // 验证类型别名 - protected $alias = [ - '>' => 'gt', '>=' => 'egt', '<' => 'lt', '<=' => 'elt', '=' => 'eq', 'same' => 'eq', - ]; - - // 当前验证的规则 - protected $rule = []; - - // 验证提示信息 - protected $message = []; - - // 验证规则默认提示信息 - protected static $typeMsg = [ - 'require' => ':attribute不能为空', - 'number' => ':attribute必须是数字', - 'float' => ':attribute必须是浮点数', - 'boolean' => ':attribute必须是布尔值', - 'email' => ':attribute格式不符', - 'array' => ':attribute必须是数组', - 'accepted' => ':attribute必须是yes、on或者1', - 'date' => ':attribute格式不符合', - 'file' => ':attribute不是有效的上传文件', - 'image' => ':attribute不是有效的图像文件', - 'alpha' => ':attribute只能是字母', - 'alphaNum' => ':attribute只能是字母和数字', - 'alphaDash' => ':attribute只能是字母、数字和下划线_及破折号-', - 'activeUrl' => ':attribute不是有效的域名或者IP', - 'chs' => ':attribute只能是汉字', - 'chsAlpha' => ':attribute只能是汉字、字母', - 'chsAlphaNum' => ':attribute只能是汉字、字母和数字', - 'chsDash' => ':attribute只能是汉字、字母、数字和下划线_及破折号-', - 'url' => ':attribute不是有效的URL地址', - 'ip' => ':attribute不是有效的IP地址', - 'dateFormat' => ':attribute必须使用日期格式 :rule', - 'in' => ':attribute必须在 :rule 范围内', - 'notIn' => ':attribute不能在 :rule 范围内', - 'between' => ':attribute只能在 :1 - :2 之间', - 'notBetween' => ':attribute不能在 :1 - :2 之间', - 'length' => ':attribute长度不符合要求 :rule', - 'max' => ':attribute长度不能超过 :rule', - 'min' => ':attribute长度不能小于 :rule', - 'after' => ':attribute日期不能小于 :rule', - 'before' => ':attribute日期不能超过 :rule', - 'expire' => '不在有效期内 :rule', - 'allowIp' => '不允许的IP访问', - 'denyIp' => '禁止的IP访问', - 'confirm' => ':attribute和字段 :rule 不一致', - 'different' => ':attribute和字段 :rule 不能相同', - 'egt' => ':attribute必须大于等于 :rule', - 'gt' => ':attribute必须大于 :rule', - 'elt' => ':attribute必须小于等于 :rule', - 'lt' => ':attribute必须小于 :rule', - 'eq' => ':attribute必须等于 :rule', - 'unique' => ':attribute已存在', - 'regex' => ':attribute不符合指定规则', - 'method' => '无效的请求类型', - 'token' => '令牌数据无效', - 'fileSize' => '上传文件大小不符', - 'fileExt' => '上传文件后缀不符', - 'fileMime' => '上传文件类型不符', - - ]; - - // 当前验证场景 - protected $currentScene = null; - - // 正则表达式 regex = ['zip'=>'\d{6}',...] - protected $regex = []; - - // 验证场景 scene = ['edit'=>'name1,name2,...'] - protected $scene = []; - - // 验证失败错误信息 - protected $error = []; - - // 批量验证 - protected $batch = false; - - /** - * 架构函数 - * @access public - * @param array $rules 验证规则 - * @param array $message 验证提示信息 - */ - public function __construct(array $rules = [], $message = []) - { - $this->rule = array_merge($this->rule, $rules); - $this->message = array_merge($this->message, $message); - } - - /** - * 实例化验证 - * @access public - * @param array $rules 验证规则 - * @param array $message 验证提示信息 - * @return Validate - */ - public static function make($rules = [], $message = []) - { - if (is_null(self::$instance)) { - self::$instance = new self($rules, $message); - } - return self::$instance; - } - - /** - * 添加字段验证规则 - * @access protected - * @param string|array $name 字段名称或者规则数组 - * @param mixed $rule 验证规则 - * @return Validate - */ - public function rule($name, $rule = '') - { - if (is_array($name)) { - $this->rule = array_merge($this->rule, $name); - } else { - $this->rule[$name] = $rule; - } - return $this; - } - - /** - * 注册验证(类型)规则 - * @access public - * @param string $type 验证规则类型 - * @param mixed $callback callback方法(或闭包) - * @return void - */ - public static function extend($type, $callback = null) - { - if (is_array($type)) { - self::$type = array_merge(self::$type, $type); - } else { - self::$type[$type] = $callback; - } - } - - /** - * 获取验证规则的默认提示信息 - * @access protected - * @param string|array $type 验证规则类型名称或者数组 - * @param string $msg 验证提示信息 - * @return void - */ - public static function setTypeMsg($type, $msg = null) - { - if (is_array($type)) { - self::$typeMsg = array_merge(self::$typeMsg, $type); - } else { - self::$typeMsg[$type] = $msg; - } - } - - /** - * 设置提示信息 - * @access public - * @param string|array $name 字段名称 - * @param string $message 提示信息 - * @return Validate - */ - public function message($name, $message = '') - { - if (is_array($name)) { - $this->message = array_merge($this->message, $name); - } else { - $this->message[$name] = $message; - } - return $this; - } - - /** - * 设置验证场景 - * @access public - * @param string|array $name 场景名或者场景设置数组 - * @param mixed $fields 要验证的字段 - * @return Validate - */ - public function scene($name, $fields = null) - { - if (is_array($name)) { - $this->scene = array_merge($this->scene, $name); - }if (is_null($fields)) { - // 设置当前场景 - $this->currentScene = $name; - } else { - // 设置验证场景 - $this->scene[$name] = $fields; - } - return $this; - } - - /** - * 设置批量验证 - * @access public - * @param bool $batch 是否批量验证 - * @return Validate - */ - public function batch($batch = true) - { - $this->batch = $batch; - return $this; - } - - /** - * 数据自动验证 - * @access public - * @param array $data 数据 - * @param mixed $rules 验证规则 - * @param string $scene 验证场景 - * @return bool - */ - public function check($data, $rules = [], $scene = '') - { - $this->error = []; - - if (empty($rules)) { - // 读取验证规则 - $rules = $this->rule; - } - - // 分析验证规则 - $scene = $this->getScene($scene); - if (is_array($scene)) { - // 处理场景验证字段 - $change = []; - $array = []; - foreach ($scene as $k => $val) { - if (is_numeric($k)) { - $array[] = $val; - } else { - $array[] = $k; - $change[$k] = $val; - } - } - } - - foreach ($rules as $key => $item) { - // field => rule1|rule2... field=>['rule1','rule2',...] - if (is_numeric($key)) { - // [field,rule1|rule2,msg1|msg2] - $key = $item[0]; - $rule = $item[1]; - if (isset($item[2])) { - $msg = is_string($item[2]) ? explode('|', $item[2]) : $item[2]; - } else { - $msg = []; - } - } else { - $rule = $item; - $msg = []; - } - if (strpos($key, '|')) { - // 字段|描述 用于指定属性名称 - list($key, $title) = explode('|', $key); - } else { - $title = $key; - } - - // 场景检测 - if (!empty($scene)) { - if ($scene instanceof \Closure && !call_user_func_array($scene, [$key, $data])) { - continue; - } elseif (is_array($scene)) { - if (!in_array($key, $array)) { - continue; - } elseif (isset($change[$key])) { - // 重载某个验证规则 - $rule = $change[$key]; - } - } - } - - // 获取数据 支持二维数组 - $value = $this->getDataValue($data, $key); - - // 字段验证 - $result = $this->checkItem($key, $value, $rule, $data, $title, $msg); - - if (true !== $result) { - // 没有返回true 则表示验证失败 - if (!empty($this->batch)) { - // 批量验证 - if (is_array($result)) { - $this->error = array_merge($this->error, $result); - } else { - $this->error[$key] = $result; - } - } else { - $this->error = $result; - return false; - } - } - } - return !empty($this->error) ? false : true; - } - - /** - * 验证单个字段规则 - * @access protected - * @param string $field 字段名 - * @param mixed $value 字段值 - * @param mixed $rules 验证规则 - * @param array $data 数据 - * @param string $title 字段描述 - * @param array $msg 提示信息 - * @return mixed - */ - protected function checkItem($field, $value, $rules, $data, $title = '', $msg = []) - { - if ($rules instanceof \Closure) { - // 匿名函数验证 支持传入当前字段和所有字段两个数据 - $result = call_user_func_array($rules, [$value, $data]); - } else { - // 支持多规则验证 require|in:a,b,c|... 或者 ['require','in'=>'a,b,c',...] - if (is_string($rules)) { - $rules = explode('|', $rules); - } - $i = 0; - foreach ($rules as $key => $rule) { - if ($rule instanceof \Closure) { - $result = call_user_func_array($rule, [$value, $data]); - } else { - // 判断验证类型 - if (is_numeric($key)) { - if (strpos($rule, ':')) { - list($type, $rule) = explode(':', $rule, 2); - if (isset($this->alias[$type])) { - // 判断别名 - $type = $this->alias[$type]; - } - $info = $type; - } elseif (method_exists($this, $rule)) { - $type = $rule; - $info = $rule; - $rule = ''; - } else { - $type = 'is'; - $info = $rule; - } - } else { - $info = $type = $key; - } - - // 如果不是require 有数据才会行验证 - if (0 === strpos($info, 'require') || (!is_null($value) && '' !== $value)) { - // 验证类型 - $callback = isset(self::$type[$type]) ? self::$type[$type] : [$this, $type]; - // 验证数据 - $result = call_user_func_array($callback, [$value, $rule, $data, $field]); - } else { - $result = true; - } - } - - if (false === $result) { - // 验证失败 返回错误信息 - if (isset($msg[$i])) { - $message = $msg[$i]; - if (is_string($message) && strpos($message, '{%') === 0) { - $message = Lang::get(substr($message, 2, -1)); - } - } else { - $message = $this->getRuleMsg($field, $title, $info, $rule); - } - return $message; - } elseif (true !== $result) { - // 返回自定义错误信息 - return $result; - } - $i++; - } - } - return true !== $result ? $result : true; - } - - /** - * 验证是否和某个字段的值一致 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - protected function confirm($value, $rule, $data) - { - return $this->getDataValue($data, $rule) == $value; - } - - /** - * 验证是否和某个字段的值是否不同 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - protected function different($value, $rule, $data) - { - return $this->getDataValue($data, $rule) != $value; - } - - /** - * 验证是否大于等于某个值 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function egt($value, $rule) - { - return $value >= $rule; - } - - /** - * 验证是否大于某个值 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function gt($value, $rule) - { - return $value > $rule; - } - - /** - * 验证是否小于等于某个值 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function elt($value, $rule) - { - return $value <= $rule; - } - - /** - * 验证是否小于某个值 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function lt($value, $rule) - { - return $value < $rule; - } - - /** - * 验证是否等于某个值 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function eq($value, $rule) - { - return $value == $rule; - } - - /** - * 验证字段值是否为有效格式 - * @access protected - * @param mixed $value 字段值 - * @param string $rule 验证规则 - * @param array $data 验证数据 - * @return bool - */ - protected function is($value, $rule, $data = []) - { - switch ($rule) { - case 'require': - // 必须 - $result = !empty($value) || '0' == $value; - break; - case 'accepted': - // 接受 - $result = in_array($value, ['1', 'on', 'yes']); - break; - case 'date': - // 是否是一个有效日期 - $result = false !== strtotime($value); - break; - case 'alpha': - // 只允许字母 - $result = $this->regex($value, '/^[A-Za-z]+$/'); - break; - case 'alphaNum': - // 只允许字母和数字 - $result = $this->regex($value, '/^[A-Za-z0-9]+$/'); - break; - case 'alphaDash': - // 只允许字母、数字和下划线 破折号 - $result = $this->regex($value, '/^[A-Za-z0-9\-\_]+$/'); - break; - case 'chs': - // 只允许汉字 - $result = $this->regex($value, '/^[\x{4e00}-\x{9fa5}]+$/u'); - break; - case 'chsAlpha': - // 只允许汉字、字母 - $result = $this->regex($value, '/^[\x{4e00}-\x{9fa5}a-zA-Z]+$/u'); - break; - case 'chsAlphaNum': - // 只允许汉字、字母和数字 - $result = $this->regex($value, '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u'); - break; - case 'chsDash': - // 只允许汉字、字母、数字和下划线_及破折号- - $result = $this->regex($value, '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9\_\-]+$/u'); - break; - case 'activeUrl': - // 是否为有效的网址 - $result = checkdnsrr($value); - break; - case 'ip': - // 是否为IP地址 - $result = $this->filter($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6); - break; - case 'url': - // 是否为一个URL地址 - $result = $this->filter($value, FILTER_VALIDATE_URL); - break; - case 'float': - // 是否为float - $result = $this->filter($value, FILTER_VALIDATE_FLOAT); - break; - case 'number': - $result = is_numeric($value); - break; - case 'integer': - // 是否为整型 - $result = $this->filter($value, FILTER_VALIDATE_INT); - break; - case 'email': - // 是否为邮箱地址 - $result = $this->filter($value, FILTER_VALIDATE_EMAIL); - break; - case 'boolean': - // 是否为布尔值 - $result = in_array($value, [0, 1, true, false]); - break; - case 'array': - // 是否为数组 - $result = is_array($value); - break; - case 'file': - $result = $value instanceof File; - break; - case 'image': - $result = $value instanceof File && in_array($this->getImageType($value->getRealPath()), [1, 2, 3, 6]); - break; - case 'token': - $result = $this->token($value, '__token__', $data); - break; - default: - if (isset(self::$type[$rule])) { - // 注册的验证规则 - $result = call_user_func_array(self::$type[$rule], [$value]); - } else { - // 正则验证 - $result = $this->regex($value, $rule); - } - } - return $result; - } - - // 判断图像类型 - protected function getImageType($image) - { - if (function_exists('exif_imagetype')) { - return exif_imagetype($image); - } else { - $info = getimagesize($image); - return $info[2]; - } - } - - /** - * 验证是否为合格的域名或者IP 支持A,MX,NS,SOA,PTR,CNAME,AAAA,A6, SRV,NAPTR,TXT 或者 ANY类型 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function activeUrl($value, $rule) - { - if (!in_array($rule, ['A', 'MX', 'NS', 'SOA', 'PTR', 'CNAME', 'AAAA', 'A6', 'SRV', 'NAPTR', 'TXT', 'ANY'])) { - $rule = 'MX'; - } - return checkdnsrr($value, $rule); - } - - /** - * 验证是否有效IP - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 ipv4 ipv6 - * @return bool - */ - protected function ip($value, $rule) - { - if (!in_array($rule, ['ipv4', 'ipv6'])) { - $rule = 'ipv4'; - } - return $this->filter($value, FILTER_VALIDATE_IP, 'ipv6' == $rule ? FILTER_FLAG_IPV6 : FILTER_FLAG_IPV4); - } - - /** - * 验证上传文件后缀 - * @access protected - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function fileExt($file, $rule) - { - if (!($file instanceof File)) { - return false; - } - if (is_string($rule)) { - $rule = explode(',', $rule); - } - if (is_array($file)) { - foreach ($file as $item) { - if (!$item->checkExt($rule)) { - return false; - } - } - return true; - } else { - return $file->checkExt($rule); - } - } - - /** - * 验证上传文件类型 - * @access protected - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function fileMime($file, $rule) - { - if (!($file instanceof File)) { - return false; - } - if (is_string($rule)) { - $rule = explode(',', $rule); - } - if (is_array($file)) { - foreach ($file as $item) { - if (!$item->checkMime($rule)) { - return false; - } - } - return true; - } else { - return $file->checkMime($rule); - } - } - - /** - * 验证上传文件大小 - * @access protected - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function fileSize($file, $rule) - { - if (!($file instanceof File)) { - return false; - } - if (is_array($file)) { - foreach ($file as $item) { - if (!$item->checkSize($rule)) { - return false; - } - } - return true; - } else { - return $file->checkSize($rule); - } - } - - /** - * 验证图片的宽高及类型 - * @access protected - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function image($file, $rule) - { - if (!($file instanceof File)) { - return false; - } - if ($rule) { - $rule = explode(',', $rule); - list($width, $height, $type) = getimagesize($file->getRealPath()); - if (isset($rule[2])) { - $imageType = strtolower($rule[2]); - if ('jpeg' == $imageType) { - $imageType = 'jpg'; - } - if (image_type_to_extension($type, false) != $imageType) { - return false; - } - } - - list($w, $h) = $rule; - return $w == $width && $h == $height; - } else { - return in_array($this->getImageType($file->getRealPath()), [1, 2, 3, 6]); - } - } - - /** - * 验证请求类型 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function method($value, $rule) - { - $method = Request::instance()->method(); - return strtoupper($rule) == $method; - } - - /** - * 验证时间和日期是否符合指定格式 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function dateFormat($value, $rule) - { - $info = date_parse_from_format($rule, $value); - return 0 == $info['warning_count'] && 0 == $info['error_count']; - } - - /** - * 验证是否唯一 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 格式:数据表,字段名,排除ID,主键名 - * @param array $data 数据 - * @param string $field 验证字段名 - * @return bool - */ - protected function unique($value, $rule, $data, $field) - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - $db = Db::name($rule[0]); - $key = isset($rule[1]) ? $rule[1] : $field; - - if (strpos($key, '^')) { - // 支持多个字段验证 - $fields = explode('^', $key); - foreach ($fields as $key) { - $map[$key] = $data[$key]; - } - } elseif (strpos($key, '=')) { - parse_str($key, $map); - } else { - $map[$key] = $data[$field]; - } - - $pk = strval(isset($rule[3]) ? $rule[3] : $db->getPk()); - if (isset($rule[2])) { - $map[$pk] = ['neq', $rule[2]]; - } elseif (isset($data[$pk])) { - $map[$pk] = ['neq', $data[$pk]]; - } - - if ($db->where($map)->field($pk)->find()) { - return false; - } - return true; - } - - /** - * 使用行为类验证 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return mixed - */ - protected function behavior($value, $rule, $data) - { - return Hook::exec($rule, '', $data); - } - - /** - * 使用filter_var方式验证 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function filter($value, $rule) - { - if (is_string($rule) && strpos($rule, ',')) { - list($rule, $param) = explode(',', $rule); - } elseif (is_array($rule)) { - $param = isset($rule[1]) ? $rule[1] : null; - } else { - $param = null; - } - return false !== filter_var($value, is_int($rule) ? $rule : filter_id($rule), $param); - } - - /** - * 验证某个字段等于某个值的时候必须 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - protected function requireIf($value, $rule, $data) - { - list($field, $val) = explode(',', $rule); - if ($this->getDataValue($data, $field) == $val) { - return !empty($value); - } else { - return true; - } - } - - /** - * 通过回调方法验证某个字段是否必须 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - protected function requireCallback($value, $rule, $data) - { - $result = call_user_func_array($rule, [$value, $data]); - if ($result) { - return !empty($value); - } else { - return true; - } - } - - /** - * 验证某个字段有值的情况下必须 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - protected function requireWith($value, $rule, $data) - { - $val = $this->getDataValue($data, $rule); - if (!empty($val)) { - return !empty($value); - } else { - return true; - } - } - - /** - * 验证是否在范围内 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function in($value, $rule) - { - return in_array($value, is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * 验证是否不在某个范围 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function notIn($value, $rule) - { - return !in_array($value, is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * between验证数据 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function between($value, $rule) - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - list($min, $max) = $rule; - return $value >= $min && $value <= $max; - } - - /** - * 使用notbetween验证数据 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function notBetween($value, $rule) - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - list($min, $max) = $rule; - return $value < $min || $value > $max; - } - - /** - * 验证数据长度 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function length($value, $rule) - { - if (is_array($value)) { - $length = count($value); - } elseif ($value instanceof File) { - $length = $value->getSize(); - } else { - $length = mb_strlen((string) $value); - } - - if (strpos($rule, ',')) { - // 长度区间 - list($min, $max) = explode(',', $rule); - return $length >= $min && $length <= $max; - } else { - // 指定长度 - return $length == $rule; - } - } - - /** - * 验证数据最大长度 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function max($value, $rule) - { - if (is_array($value)) { - $length = count($value); - } elseif ($value instanceof File) { - $length = $value->getSize(); - } else { - $length = mb_strlen((string) $value); - } - return $length <= $rule; - } - - /** - * 验证数据最小长度 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function min($value, $rule) - { - if (is_array($value)) { - $length = count($value); - } elseif ($value instanceof File) { - $length = $value->getSize(); - } else { - $length = mb_strlen((string) $value); - } - return $length >= $rule; - } - - /** - * 验证日期 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function after($value, $rule) - { - return strtotime($value) >= strtotime($rule); - } - - /** - * 验证日期 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function before($value, $rule) - { - return strtotime($value) <= strtotime($rule); - } - - /** - * 验证有效期 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - protected function expire($value, $rule) - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - list($start, $end) = $rule; - if (!is_numeric($start)) { - $start = strtotime($start); - } - - if (!is_numeric($end)) { - $end = strtotime($end); - } - return $_SERVER['REQUEST_TIME'] >= $start && $_SERVER['REQUEST_TIME'] <= $end; - } - - /** - * 验证IP许可 - * @access protected - * @param string $value 字段值 - * @param mixed $rule 验证规则 - * @return mixed - */ - protected function allowIp($value, $rule) - { - return in_array($_SERVER['REMOTE_ADDR'], is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * 验证IP禁用 - * @access protected - * @param string $value 字段值 - * @param mixed $rule 验证规则 - * @return mixed - */ - protected function denyIp($value, $rule) - { - return !in_array($_SERVER['REMOTE_ADDR'], is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * 使用正则验证数据 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 正则规则或者预定义正则名 - * @return mixed - */ - protected function regex($value, $rule) - { - if (isset($this->regex[$rule])) { - $rule = $this->regex[$rule]; - } - if (0 !== strpos($rule, '/') && !preg_match('/\/[imsU]{0,4}$/', $rule)) { - // 不是正则表达式则两端补上/ - $rule = '/^' . $rule . '$/'; - } - return 1 === preg_match($rule, (string) $value); - } - - /** - * 验证表单令牌 - * @access protected - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - protected function token($value, $rule, $data) - { - $rule = !empty($rule) ? $rule : '__token__'; - if (!isset($data[$rule]) || !Session::has($rule)) { - // 令牌数据无效 - return false; - } - - // 令牌验证 - if (isset($data[$rule]) && Session::get($rule) === $data[$rule]) { - // 防止重复提交 - Session::delete($rule); // 验证完成销毁session - return true; - } - // 开启TOKEN重置 - Session::delete($rule); - return false; - } - - // 获取错误信息 - public function getError() - { - return $this->error; - } - - /** - * 获取数据值 - * @access protected - * @param array $data 数据 - * @param string $key 数据标识 支持二维 - * @return mixed - */ - protected function getDataValue($data, $key) - { - if (strpos($key, '.')) { - // 支持二维数组验证 - list($name1, $name2) = explode('.', $key); - $value = isset($data[$name1][$name2]) ? $data[$name1][$name2] : null; - } else { - $value = isset($data[$key]) ? $data[$key] : null; - } - return $value; - } - - /** - * 获取验证规则的错误提示信息 - * @access protected - * @param string $attribute 字段英文名 - * @param string $title 字段描述名 - * @param string $type 验证规则名称 - * @param mixed $rule 验证规则数据 - * @return string - */ - protected function getRuleMsg($attribute, $title, $type, $rule) - { - if (isset($this->message[$attribute . '.' . $type])) { - $msg = $this->message[$attribute . '.' . $type]; - } elseif (isset($this->message[$attribute])) { - $msg = $this->message[$attribute]; - } elseif (isset(self::$typeMsg[$type])) { - $msg = self::$typeMsg[$type]; - } else { - $msg = $title . '规则错误'; - } - - if (is_string($msg) && strpos($msg, '{%')) { - $msg = Lang::get(substr($msg, 2, -1)); - } - - if (is_string($msg) && false !== strpos($msg, ':')) { - // 变量替换 - if (strpos($rule, ',')) { - $array = array_pad(explode(',', $rule), 3, ''); - } else { - $array = array_pad([], 3, ''); - } - $msg = str_replace( - [':attribute', ':rule', ':1', ':2', ':3'], - [$title, (string) $rule, $array[0], $array[1], $array[2]], - $msg); - } - return $msg; - } - - /** - * 获取数据验证的场景 - * @access protected - * @param string $scene 验证场景 - * @return array - */ - protected function getScene($scene = '') - { - if (empty($scene)) { - // 读取指定场景 - $scene = $this->currentScene; - } - - if (!empty($scene) && isset($this->scene[$scene])) { - // 如果设置了验证适用场景 - $scene = $this->scene[$scene]; - if (is_string($scene)) { - $scene = explode(',', $scene); - } - } else { - $scene = []; - } - return $scene; - } - - public static function __callStatic($method, $params) - { - $class = new static; - if (method_exists($class, $method)) { - return call_user_func_array([$class, $method], $params); - } else { - throw new \BadMethodCallException('method not exists:' . __CLASS__ . '->' . $method); - } - } -} diff --git a/thinkphp/library/think/View.php b/thinkphp/library/think/View.php deleted file mode 100755 index da08703..0000000 --- a/thinkphp/library/think/View.php +++ /dev/null @@ -1,204 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -class View -{ - // 视图实例 - protected static $instance; - // 模板引擎实例 - public $engine; - // 模板变量 - protected $data = []; - // 视图输出替换 - protected $replace = []; - - /** - * 架构函数 - * @access public - * @param array $engine 模板引擎参数 - * @param array $replace 字符串替换参数 - */ - public function __construct($engine = [], $replace = []) - { - // 初始化模板引擎 - $this->engine((array) $engine); - $this->replace = $replace; - } - - /** - * 初始化视图 - * @access public - * @param array $engine 模板引擎参数 - * @param array $replace 字符串替换参数 - * @return object - */ - public static function instance($engine = [], $replace = []) - { - if (is_null(self::$instance)) { - self::$instance = new self($engine, $replace); - } - return self::$instance; - } - - /** - * 模板变量赋值 - * @access public - * @param mixed $name 变量名 - * @param mixed $value 变量值 - * @return $this - */ - public function assign($name, $value = '') - { - if (is_array($name)) { - $this->data = array_merge($this->data, $name); - } else { - $this->data[$name] = $value; - } - return $this; - } - - /** - * 设置当前模板解析的引擎 - * @access public - * @param array|string $options 引擎参数 - * @return $this - */ - public function engine($options = []) - { - if (is_string($options)) { - $type = $options; - $options = []; - } else { - $type = !empty($options['type']) ? $options['type'] : 'Think'; - } - - $class = false !== strpos($type, '\\') ? $type : '\\think\\view\\driver\\' . ucfirst($type); - if (isset($options['type'])) { - unset($options['type']); - } - $this->engine = new $class($options); - return $this; - } - - /** - * 配置模板引擎 - * @access private - * @param string|array $name 参数名 - * @param mixed $value 参数值 - * @return void - */ - public function config($name, $value = null) - { - $this->engine->config($name, $value); - return $this; - } - - /** - * 解析和获取模板内容 用于输出 - * @param string $template 模板文件名或者内容 - * @param array $vars 模板输出变量 - * @param array $replace 替换内容 - * @param array $config 模板参数 - * @param bool $renderContent 是否渲染内容 - * @return string - * @throws Exception - */ - public function fetch($template = '', $vars = [], $replace = [], $config = [], $renderContent = false) - { - // 模板变量 - $vars = array_merge($this->data, $vars); - - // 页面缓存 - ob_start(); - ob_implicit_flush(0); - - // 渲染输出 - $method = $renderContent ? 'display' : 'fetch'; - $this->engine->$method($template, $vars, $config); - - // 获取并清空缓存 - $content = ob_get_clean(); - // 内容过滤标签 - Hook::listen('view_filter', $content); - // 允许用户自定义模板的字符串替换 - $replace = array_merge($this->replace, $replace); - if (!empty($replace)) { - $content = strtr($content, $replace); - } - return $content; - } - - /** - * 视图内容替换 - * @access public - * @param string|array $content 被替换内容(支持批量替换) - * @param string $replace 替换内容 - * @return $this - */ - public function replace($content, $replace = '') - { - if (is_array($content)) { - $this->replace = array_merge($this->replace, $content); - } else { - $this->replace[$content] = $replace; - } - return $this; - } - - /** - * 渲染内容输出 - * @access public - * @param string $content 内容 - * @param array $vars 模板输出变量 - * @param array $replace 替换内容 - * @param array $config 模板参数 - * @return mixed - */ - public function display($content, $vars = [], $replace = [], $config = []) - { - return $this->fetch($content, $vars, $replace, $config, true); - } - - /** - * 模板变量赋值 - * @access public - * @param string $name 变量名 - * @param mixed $value 变量值 - */ - public function __set($name, $value) - { - $this->data[$name] = $value; - } - - /** - * 取得模板显示变量的值 - * @access protected - * @param string $name 模板变量 - * @return mixed - */ - public function __get($name) - { - return $this->data[$name]; - } - - /** - * 检测模板变量是否设置 - * @access public - * @param string $name 模板变量名 - * @return bool - */ - public function __isset($name) - { - return isset($this->data[$name]); - } -} diff --git a/thinkphp/library/think/cache/Driver.php b/thinkphp/library/think/cache/Driver.php deleted file mode 100755 index a2a5779..0000000 --- a/thinkphp/library/think/cache/Driver.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache; - -/** - * 缓存基础类 - */ -abstract class Driver -{ - protected $handler = null; - protected $options = []; - protected $tag; - - /** - * 判断缓存是否存在 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - abstract public function has($name); - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - abstract public function get($name, $default = false); - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int $expire 有效时间 0为永久 - * @return boolean - */ - abstract public function set($name, $value, $expire = null); - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - abstract public function inc($name, $step = 1); - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - abstract public function dec($name, $step = 1); - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return boolean - */ - abstract public function rm($name); - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return boolean - */ - abstract public function clear($tag = null); - - /** - * 获取实际的缓存标识 - * @access public - * @param string $name 缓存名 - * @return string - */ - protected function getCacheKey($name) - { - return $this->options['prefix'] . $name; - } - - /** - * 读取缓存并删除 - * @access public - * @param string $name 缓存变量名 - * @return mixed - */ - public function pull($name) - { - $result = $this->get($name, false); - if ($result) { - $this->rm($name); - return $result; - } else { - return null; - } - } - - /** - * 如果不存在则写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int $expire 有效时间 0为永久 - * @return mixed - */ - public function remember($name, $value, $expire = null) - { - if (!$this->has($name)) { - if ($value instanceof \Closure) { - $value = call_user_func($value); - } - $this->set($name, $value, $expire); - } else { - $value = $this->get($name); - } - return $value; - } - - /** - * 缓存标签 - * @access public - * @param string $name 标签名 - * @param string|array $keys 缓存标识 - * @param bool $overlay 是否覆盖 - * @return $this - */ - public function tag($name, $keys = null, $overlay = false) - { - if (is_null($keys)) { - $this->tag = $name; - } else { - $key = 'tag_' . md5($name); - if (is_string($keys)) { - $keys = explode(',', $keys); - } - $keys = array_map([$this, 'getCacheKey'], $keys); - if ($overlay) { - $value = $keys; - } else { - $value = array_unique(array_merge($this->getTagItem($name), $keys)); - } - $this->set($key, implode(',', $value)); - } - return $this; - } - - /** - * 更新标签 - * @access public - * @param string $name 缓存标识 - * @return void - */ - protected function setTagItem($name) - { - if ($this->tag) { - $key = 'tag_' . md5($this->tag); - $this->tag = null; - if ($this->has($key)) { - $value = $this->get($key); - $value .= ',' . $name; - } else { - $value = $name; - } - $this->set($key, $value); - } - } - - /** - * 获取标签包含的缓存标识 - * @access public - * @param string $tag 缓存标签 - * @return array - */ - protected function getTagItem($tag) - { - $key = 'tag_' . md5($tag); - $value = $this->get($key); - if ($value) { - return explode(',', $value); - } else { - return []; - } - } - - /** - * 返回句柄对象,可执行其它高级方法 - * - * @access public - * @return object - */ - public function handler() - { - return $this->handler; - } -} diff --git a/thinkphp/library/think/cache/driver/File.php b/thinkphp/library/think/cache/driver/File.php deleted file mode 100755 index 5c98d79..0000000 --- a/thinkphp/library/think/cache/driver/File.php +++ /dev/null @@ -1,247 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; - -/** - * 文件类型缓存类 - * @author liu21st <liu21st@gmail.com> - */ -class File extends Driver -{ - protected $options = [ - 'expire' => 0, - 'cache_subdir' => false, - 'prefix' => '', - 'path' => CACHE_PATH, - 'data_compress' => false, - ]; - - /** - * 架构函数 - * @param array $options - */ - public function __construct($options = []) - { - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - if (substr($this->options['path'], -1) != DS) { - $this->options['path'] .= DS; - } - $this->init(); - } - - /** - * 初始化检查 - * @access private - * @return boolean - */ - private function init() - { - // 创建项目缓存目录 - if (!is_dir($this->options['path'])) { - if (mkdir($this->options['path'], 0755, true)) { - return true; - } - } - return false; - } - - /** - * 取得变量的存储文件名 - * @access protected - * @param string $name 缓存变量名 - * @return string - */ - protected function getCacheKey($name) - { - $name = md5($name); - if ($this->options['cache_subdir']) { - // 使用子目录 - $name = substr($name, 0, 2) . DS . substr($name, 2); - } - if ($this->options['prefix']) { - $name = $this->options['prefix'] . DS . $name; - } - $filename = $this->options['path'] . $name . '.php'; - $dir = dirname($filename); - if (!is_dir($dir)) { - mkdir($dir, 0755, true); - } - return $filename; - } - - /** - * 判断缓存是否存在 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name) - { - return $this->get($name) ? true : false; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $filename = $this->getCacheKey($name); - if (!is_file($filename)) { - return $default; - } - $content = file_get_contents($filename); - if (false !== $content) { - $expire = (int) substr($content, 8, 12); - if (0 != $expire && $_SERVER['REQUEST_TIME'] > filemtime($filename) + $expire) { - //缓存过期删除缓存文件 - $this->unlink($filename); - return $default; - } - $content = substr($content, 20, -3); - if ($this->options['data_compress'] && function_exists('gzcompress')) { - //启用数据压缩 - $content = gzuncompress($content); - } - $content = unserialize($content); - return $content; - } else { - return $default; - } - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int $expire 有效时间 0为永久 - * @return boolean - */ - public function set($name, $value, $expire = null) - { - if (is_null($expire)) { - $expire = $this->options['expire']; - } - $filename = $this->getCacheKey($name); - if ($this->tag && !is_file($filename)) { - $first = true; - } - $data = serialize($value); - if ($this->options['data_compress'] && function_exists('gzcompress')) { - //数据压缩 - $data = gzcompress($data, 3); - } - $data = "<?php\n//" . sprintf('%012d', $expire) . $data . "\n?>"; - $result = file_put_contents($filename, $data); - if ($result) { - isset($first) && $this->setTagItem($filename); - clearstatcache(); - return true; - } else { - return false; - } - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - if ($this->has($name)) { - $value = $this->get($name) + $step; - } else { - $value = $step; - } - return $this->set($name, $value, 0) ? $value : false; - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - if ($this->has($name)) { - $value = $this->get($name) - $step; - } else { - $value = $step; - } - return $this->set($name, $value, 0) ? $value : false; - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return boolean - */ - public function rm($name) - { - return $this->unlink($this->getCacheKey($name)); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return boolean - */ - public function clear($tag = null) - { - if ($tag) { - // 指定标签清除 - $keys = $this->getTagItem($tag); - foreach ($keys as $key) { - $this->unlink($key); - } - $this->rm('tag_' . md5($tag)); - return true; - } - $files = (array) glob($this->options['path'] . ($this->options['prefix'] ? $this->options['prefix'] . DS : '') . '*'); - foreach ($files as $path) { - if (is_dir($path)) { - array_map('unlink', glob($path . '/*.php')); - } else { - unlink($path); - } - } - return true; - } - - /** - * 判断文件是否存在后,删除 - * @param $path - * @return bool - * @author byron sampson <xiaobo.sun@qq.com> - * @return boolean - */ - private function unlink($path) - { - return is_file($path) && unlink($path); - } - -} diff --git a/thinkphp/library/think/cache/driver/Lite.php b/thinkphp/library/think/cache/driver/Lite.php deleted file mode 100755 index b9d1009..0000000 --- a/thinkphp/library/think/cache/driver/Lite.php +++ /dev/null @@ -1,185 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; - -/** - * 文件类型缓存类 - * @author liu21st <liu21st@gmail.com> - */ -class Lite extends Driver -{ - protected $options = [ - 'prefix' => '', - 'path' => '', - 'expire' => 0, // 等于 10*365*24*3600(10年) - ]; - - /** - * 架构函数 - * @access public - * - * @param array $options - */ - public function __construct($options = []) - { - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - if (substr($this->options['path'], -1) != DS) { - $this->options['path'] .= DS; - } - - } - - /** - * 取得变量的存储文件名 - * @access protected - * @param string $name 缓存变量名 - * @return string - */ - protected function getCacheKey($name) - { - return $this->options['path'] . $this->options['prefix'] . md5($name) . '.php'; - } - - /** - * 判断缓存是否存在 - * @access public - * @param string $name 缓存变量名 - * @return mixed - */ - public function has($name) - { - return $this->get($name) ? true : false; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $filename = $this->getCacheKey($name); - if (is_file($filename)) { - // 判断是否过期 - $mtime = filemtime($filename); - if ($mtime < $_SERVER['REQUEST_TIME']) { - // 清除已经过期的文件 - unlink($filename); - return $default; - } - return include $filename; - } else { - return $default; - } - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int $expire 有效时间 0为永久 - * @return bool - */ - public function set($name, $value, $expire = null) - { - if (is_null($expire)) { - $expire = $this->options['expire']; - } - // 模拟永久 - if (0 === $expire) { - $expire = 10 * 365 * 24 * 3600; - } - $filename = $this->getCacheKey($name); - if ($this->tag && !is_file($filename)) { - $first = true; - } - $ret = file_put_contents($filename, ("<?php return " . var_export($value, true) . ";")); - // 通过设置修改时间实现有效期 - if ($ret) { - isset($first) && $this->setTagItem($filename); - touch($filename, $_SERVER['REQUEST_TIME'] + $expire); - } - return $ret; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - if ($this->has($name)) { - $value = $this->get($name) + $step; - } else { - $value = $step; - } - return $this->set($name, $value, 0) ? $value : false; - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - if ($this->has($name)) { - $value = $this->get($name) - $step; - } else { - $value = $step; - } - return $this->set($name, $value, 0) ? $value : false; - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return boolean - */ - public function rm($name) - { - return unlink($this->getCacheKey($name)); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return bool - */ - public function clear($tag = null) - { - if ($tag) { - // 指定标签清除 - $keys = $this->getTagItem($tag); - foreach ($keys as $key) { - unlink($key); - } - $this->rm('tag_' . md5($tag)); - return true; - } - array_map("unlink", glob($this->options['path'] . ($this->options['prefix'] ? $this->options['prefix'] . DS : '') . '*.php')); - } -} diff --git a/thinkphp/library/think/cache/driver/Memcache.php b/thinkphp/library/think/cache/driver/Memcache.php deleted file mode 100755 index bddf715..0000000 --- a/thinkphp/library/think/cache/driver/Memcache.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; -use think\Exception; - -class Memcache extends Driver -{ - protected $options = [ - 'host' => '127.0.0.1', - 'port' => 11211, - 'expire' => 0, - 'timeout' => 0, // 超时时间(单位:毫秒) - 'persistent' => true, - 'prefix' => '', - ]; - - /** - * 架构函数 - * @param array $options 缓存参数 - * @access public - * @throws \BadFunctionCallException - */ - public function __construct($options = []) - { - if (!extension_loaded('memcache')) { - throw new \BadFunctionCallException('not support: memcache'); - } - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - $this->handler = new \Memcache; - // 支持集群 - $hosts = explode(',', $this->options['host']); - $ports = explode(',', $this->options['port']); - if (empty($ports[0])) { - $ports[0] = 11211; - } - // 建立连接 - foreach ((array) $hosts as $i => $host) { - $port = isset($ports[$i]) ? $ports[$i] : $ports[0]; - $this->options['timeout'] > 0 ? - $this->handler->addServer($host, $port, $this->options['persistent'], 1, $this->options['timeout']) : - $this->handler->addServer($host, $port, $this->options['persistent'], 1); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name) - { - $key = $this->getCacheKey($name); - return $this->handler->get($key) ? true : false; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $result = $this->handler->get($this->getCacheKey($name)); - return false !== $result ? $result : $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null) - { - if (is_null($expire)) { - $expire = $this->options['expire']; - } - if ($this->tag && !$this->has($name)) { - $first = true; - } - $key = $this->getCacheKey($name); - if ($this->handler->set($key, $value, 0, $expire)) { - isset($first) && $this->setTagItem($key); - return true; - } - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - $key = $this->getCacheKey($name); - return $this->handler->increment($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - $key = $this->getCacheKey($name); - $value = $this->handler->get($key) - $step; - $res = $this->handler->set($key, $value); - if (!$res) { - return false; - } else { - return $value; - } - } - - /** - * 删除缓存 - * @param string $name 缓存变量名 - * @param bool|false $ttl - * @return bool - */ - public function rm($name, $ttl = false) - { - $key = $this->getCacheKey($name); - return false === $ttl ? - $this->handler->delete($key) : - $this->handler->delete($key, $ttl); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return bool - */ - public function clear($tag = null) - { - if ($tag) { - // 指定标签清除 - $keys = $this->getTagItem($tag); - foreach ($keys as $key) { - $this->handler->delete($key); - } - $this->rm('tag_' . md5($tag)); - return true; - } - return $this->handler->flush(); - } -} diff --git a/thinkphp/library/think/cache/driver/Memcached.php b/thinkphp/library/think/cache/driver/Memcached.php deleted file mode 100755 index 4c4505b..0000000 --- a/thinkphp/library/think/cache/driver/Memcached.php +++ /dev/null @@ -1,181 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; - -class Memcached extends Driver -{ - protected $options = [ - 'host' => '127.0.0.1', - 'port' => 11211, - 'expire' => 0, - 'timeout' => 0, // 超时时间(单位:毫秒) - 'prefix' => '', - 'username' => '', //账号 - 'password' => '', //密码 - 'option' => [], - ]; - - /** - * 架构函数 - * @param array $options 缓存参数 - * @access public - */ - public function __construct($options = []) - { - if (!extension_loaded('memcached')) { - throw new \BadFunctionCallException('not support: memcached'); - } - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - $this->handler = new \Memcached; - if (!empty($this->options['option'])) { - $this->handler->setOptions($this->options['option']); - } - // 设置连接超时时间(单位:毫秒) - if ($this->options['timeout'] > 0) { - $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->options['timeout']); - } - // 支持集群 - $hosts = explode(',', $this->options['host']); - $ports = explode(',', $this->options['port']); - if (empty($ports[0])) { - $ports[0] = 11211; - } - // 建立连接 - $servers = []; - foreach ((array) $hosts as $i => $host) { - $servers[] = [$host, (isset($ports[$i]) ? $ports[$i] : $ports[0]), 1]; - } - $this->handler->addServers($servers); - if ('' != $this->options['username']) { - $this->handler->setOption(\Memcached::OPT_BINARY_PROTOCOL, true); - $this->handler->setSaslAuthData($this->options['username'], $this->options['password']); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name) - { - $key = $this->getCacheKey($name); - return $this->handler->get($key) ? true : false; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $result = $this->handler->get($this->getCacheKey($name)); - return false !== $result ? $result : $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null) - { - if (is_null($expire)) { - $expire = $this->options['expire']; - } - if ($this->tag && !$this->has($name)) { - $first = true; - } - $key = $this->getCacheKey($name); - $expire = 0 == $expire ? 0 : $_SERVER['REQUEST_TIME'] + $expire; - if ($this->handler->set($key, $value, $expire)) { - isset($first) && $this->setTagItem($key); - return true; - } - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - $key = $this->getCacheKey($name); - return $this->handler->increment($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - $key = $this->getCacheKey($name); - $value = $this->handler->get($key) - $step; - $res = $this->handler->set($key, $value); - if (!$res) { - return false; - } else { - return $value; - } - } - - /** - * 删除缓存 - * @param string $name 缓存变量名 - * @param bool|false $ttl - * @return bool - */ - public function rm($name, $ttl = false) - { - $key = $this->getCacheKey($name); - return false === $ttl ? - $this->handler->delete($key) : - $this->handler->delete($key, $ttl); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return bool - */ - public function clear($tag = null) - { - if ($tag) { - // 指定标签清除 - $keys = $this->getTagItem($tag); - $this->handler->deleteMulti($keys); - $this->rm('tag_' . md5($tag)); - return true; - } - return $this->handler->flush(); - } -} diff --git a/thinkphp/library/think/cache/driver/Redis.php b/thinkphp/library/think/cache/driver/Redis.php deleted file mode 100755 index e7f7876..0000000 --- a/thinkphp/library/think/cache/driver/Redis.php +++ /dev/null @@ -1,176 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; - -/** - * Redis缓存驱动,适合单机部署、有前端代理实现高可用的场景,性能最好 - * 有需要在业务层实现读写分离、或者使用RedisCluster的需求,请使用Redisd驱动 - * - * 要求安装phpredis扩展:https://github.com/nicolasff/phpredis - * @author 尘缘 <130775@qq.com> - */ -class Redis extends Driver -{ - protected $options = [ - 'host' => '127.0.0.1', - 'port' => 6379, - 'password' => '', - 'select' => 0, - 'timeout' => 0, - 'expire' => 0, - 'persistent' => false, - 'prefix' => '', - ]; - - /** - * 架构函数 - * @param array $options 缓存参数 - * @access public - */ - public function __construct($options = []) - { - if (!extension_loaded('redis')) { - throw new \BadFunctionCallException('not support: redis'); - } - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - $func = $this->options['persistent'] ? 'pconnect' : 'connect'; - $this->handler = new \Redis; - $this->handler->$func($this->options['host'], $this->options['port'], $this->options['timeout']); - - if ('' != $this->options['password']) { - $this->handler->auth($this->options['password']); - } - - if (0 != $this->options['select']) { - $this->handler->select($this->options['select']); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name) - { - return $this->handler->get($this->getCacheKey($name)) ? true : false; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $value = $this->handler->get($this->getCacheKey($name)); - if (is_null($value)) { - return $default; - } - $jsonData = json_decode($value, true); - // 检测是否为JSON数据 true 返回JSON解析数组, false返回源数据 byron sampson<xiaobo.sun@qq.com> - return (null === $jsonData) ? $value : $jsonData; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer $expire 有效时间(秒) - * @return boolean - */ - public function set($name, $value, $expire = null) - { - if (is_null($expire)) { - $expire = $this->options['expire']; - } - if ($this->tag && !$this->has($name)) { - $first = true; - } - $key = $this->getCacheKey($name); - //对数组/对象数据进行缓存处理,保证数据完整性 byron sampson<xiaobo.sun@qq.com> - $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value; - if (is_int($expire) && $expire) { - $result = $this->handler->setex($key, $expire, $value); - } else { - $result = $this->handler->set($key, $value); - } - isset($first) && $this->setTagItem($key); - return $result; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - $key = $this->getCacheKey($name); - return $this->handler->incrby($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - $key = $this->getCacheKey($name); - return $this->handler->decrby($key, $step); - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return boolean - */ - public function rm($name) - { - return $this->handler->delete($this->getCacheKey($name)); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return boolean - */ - public function clear($tag = null) - { - if ($tag) { - // 指定标签清除 - $keys = $this->getTagItem($tag); - foreach ($keys as $key) { - $this->handler->delete($key); - } - $this->rm('tag_' . md5($tag)); - return true; - } - return $this->handler->flushDB(); - } - -} diff --git a/thinkphp/library/think/cache/driver/Sqlite.php b/thinkphp/library/think/cache/driver/Sqlite.php deleted file mode 100755 index 6dbd41f..0000000 --- a/thinkphp/library/think/cache/driver/Sqlite.php +++ /dev/null @@ -1,196 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; -use think\Exception; - -/** - * Sqlite缓存驱动 - * @author liu21st <liu21st@gmail.com> - */ -class Sqlite extends Driver -{ - protected $options = [ - 'db' => ':memory:', - 'table' => 'sharedmemory', - 'prefix' => '', - 'expire' => 0, - 'persistent' => false, - ]; - - /** - * 架构函数 - * @param array $options 缓存参数 - * @throws \BadFunctionCallException - * @access public - */ - public function __construct($options = []) - { - if (!extension_loaded('sqlite')) { - throw new \BadFunctionCallException('not support: sqlite'); - } - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - $func = $this->options['persistent'] ? 'sqlite_popen' : 'sqlite_open'; - $this->handler = $func($this->options['db']); - } - - /** - * 获取实际的缓存标识 - * @access public - * @param string $name 缓存名 - * @return string - */ - protected function getCacheKey($name) - { - return $this->options['prefix'] . sqlite_escape_string($name); - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name) - { - $name = $this->getCacheKey($name); - $sql = 'SELECT value FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\' AND (expire=0 OR expire >' . $_SERVER['REQUEST_TIME'] . ') LIMIT 1'; - $result = sqlite_query($this->handler, $sql); - return sqlite_num_rows($result); - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $name = $this->getCacheKey($name); - $sql = 'SELECT value FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\' AND (expire=0 OR expire >' . $_SERVER['REQUEST_TIME'] . ') LIMIT 1'; - $result = sqlite_query($this->handler, $sql); - if (sqlite_num_rows($result)) { - $content = sqlite_fetch_single($result); - if (function_exists('gzcompress')) { - //启用数据压缩 - $content = gzuncompress($content); - } - return unserialize($content); - } - return $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer $expire 有效时间(秒) - * @return boolean - */ - public function set($name, $value, $expire = null) - { - $name = $this->getCacheKey($name); - $value = sqlite_escape_string(serialize($value)); - if (is_null($expire)) { - $expire = $this->options['expire']; - } - $expire = (0 == $expire) ? 0 : ($_SERVER['REQUEST_TIME'] + $expire); //缓存有效期为0表示永久缓存 - if (function_exists('gzcompress')) { - //数据压缩 - $value = gzcompress($value, 3); - } - if ($this->tag) { - $tag = $this->tag; - $this->tag = null; - } else { - $tag = ''; - } - $sql = 'REPLACE INTO ' . $this->options['table'] . ' (var, value, expire, tag) VALUES (\'' . $name . '\', \'' . $value . '\', \'' . $expire . '\', \'' . $tag . '\')'; - if (sqlite_query($this->handler, $sql)) { - return true; - } - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - if ($this->has($name)) { - $value = $this->get($name) + $step; - } else { - $value = $step; - } - return $this->set($name, $value, 0) ? $value : false; - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - if ($this->has($name)) { - $value = $this->get($name) - $step; - } else { - $value = $step; - } - return $this->set($name, $value, 0) ? $value : false; - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return boolean - */ - public function rm($name) - { - $name = $this->getCacheKey($name); - $sql = 'DELETE FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\''; - sqlite_query($this->handler, $sql); - return true; - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return boolean - */ - public function clear($tag = null) - { - if ($tag) { - $name = sqlite_escape_string($tag); - $sql = 'DELETE FROM ' . $this->options['table'] . ' WHERE tag=\'' . $name . '\''; - sqlite_query($this->handler, $sql); - return true; - } - $sql = 'DELETE FROM ' . $this->options['table']; - sqlite_query($this->handler, $sql); - return true; - } -} diff --git a/thinkphp/library/think/cache/driver/Wincache.php b/thinkphp/library/think/cache/driver/Wincache.php deleted file mode 100755 index a9cc7d2..0000000 --- a/thinkphp/library/think/cache/driver/Wincache.php +++ /dev/null @@ -1,150 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; -use think\Exception; - -/** - * Wincache缓存驱动 - * @author liu21st <liu21st@gmail.com> - */ -class Wincache extends Driver -{ - protected $options = [ - 'prefix' => '', - 'expire' => 0, - ]; - - /** - * 架构函数 - * @param array $options 缓存参数 - * @throws Exception - * @access public - */ - public function __construct($options = []) - { - if (!function_exists('wincache_ucache_info')) { - throw new \BadFunctionCallException('not support: WinCache'); - } - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name) - { - $key = $this->getCacheKey($name); - return wincache_ucache_exists($key); - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $key = $this->getCacheKey($name); - return wincache_ucache_exists($key) ? wincache_ucache_get($key) : $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer $expire 有效时间(秒) - * @return boolean - */ - public function set($name, $value, $expire = null) - { - if (is_null($expire)) { - $expire = $this->options['expire']; - } - $key = $this->getCacheKey($name); - if ($this->tag && !$this->has($name)) { - $first = true; - } - if (wincache_ucache_set($key, $value, $expire)) { - isset($first) && $this->setTagItem($key); - return true; - } - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - $key = $this->getCacheKey($name); - return wincache_ucache_inc($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - $key = $this->getCacheKey($name); - return wincache_ucache_dec($key, $step); - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return boolean - */ - public function rm($name) - { - return wincache_ucache_delete($this->getCacheKey($name)); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return boolean - */ - public function clear($tag = null) - { - if ($tag) { - $keys = $this->getTagItem($tag); - foreach ($keys as $key) { - wincache_ucache_delete($key); - } - $this->rm('tag_' . md5($tag)); - return true; - } else { - return wincache_ucache_clear(); - } - } - -} diff --git a/thinkphp/library/think/cache/driver/Xcache.php b/thinkphp/library/think/cache/driver/Xcache.php deleted file mode 100755 index 6b18b3f..0000000 --- a/thinkphp/library/think/cache/driver/Xcache.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\cache\driver; - -use think\cache\Driver; -use think\Exception; - -/** - * Xcache缓存驱动 - * @author liu21st <liu21st@gmail.com> - */ -class Xcache extends Driver -{ - protected $options = [ - 'prefix' => '', - 'expire' => 0, - ]; - - /** - * 架构函数 - * @param array $options 缓存参数 - * @access public - * @throws \BadFunctionCallException - */ - public function __construct($options = []) - { - if (!function_exists('xcache_info')) { - throw new \BadFunctionCallException('not support: Xcache'); - } - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name) - { - $key = $this->getCacheKey($name); - return xcache_isset($key); - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = false) - { - $key = $this->getCacheKey($name); - return xcache_isset($key) ? xcache_get($key) : $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer $expire 有效时间(秒) - * @return boolean - */ - public function set($name, $value, $expire = null) - { - if (is_null($expire)) { - $expire = $this->options['expire']; - } - if ($this->tag && !$this->has($name)) { - $first = true; - } - $key = $this->getCacheKey($name); - if (xcache_set($key, $value, $expire)) { - isset($first) && $this->setTagItem($key); - return true; - } - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc($name, $step = 1) - { - $key = $this->getCacheKey($name); - return xcache_inc($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec($name, $step = 1) - { - $key = $this->getCacheKey($name); - return xcache_dec($key, $step); - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return boolean - */ - public function rm($name) - { - return xcache_unset($this->getCacheKey($name)); - } - - /** - * 清除缓存 - * @access public - * @param string $tag 标签名 - * @return boolean - */ - public function clear($tag = null) - { - if ($tag) { - // 指定标签清除 - $keys = $this->getTagItem($tag); - foreach ($keys as $key) { - xcache_unset($key); - } - $this->rm('tag_' . md5($tag)); - return true; - } - if (function_exists('xcache_unset_by_prefix')) { - return xcache_unset_by_prefix($this->options['prefix']); - } else { - return false; - } - } -} diff --git a/thinkphp/library/think/config/driver/Ini.php b/thinkphp/library/think/config/driver/Ini.php deleted file mode 100755 index d8dc558..0000000 --- a/thinkphp/library/think/config/driver/Ini.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\config\driver; - -class Ini -{ - public function parse($config) - { - if (is_file($config)) { - return parse_ini_file($config, true); - } else { - return parse_ini_string($config, true); - } - } -} diff --git a/thinkphp/library/think/config/driver/Json.php b/thinkphp/library/think/config/driver/Json.php deleted file mode 100755 index ec2419f..0000000 --- a/thinkphp/library/think/config/driver/Json.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\config\driver; - -class Json -{ - public function parse($config) - { - if (is_file($config)) { - $config = file_get_contents($config); - } - $result = json_decode($config, true); - return $result; - } -} diff --git a/thinkphp/library/think/config/driver/Xml.php b/thinkphp/library/think/config/driver/Xml.php deleted file mode 100755 index 5bc9301..0000000 --- a/thinkphp/library/think/config/driver/Xml.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\config\driver; - -class Xml -{ - public function parse($config) - { - if (is_file($config)) { - $content = simplexml_load_file($config); - } else { - $content = simplexml_load_string($config); - } - $result = (array) $content; - foreach ($result as $key => $val) { - if (is_object($val)) { - $result[$key] = (array) $val; - } - } - return $result; - } -} diff --git a/thinkphp/library/think/console/Command.php b/thinkphp/library/think/console/Command.php deleted file mode 100755 index d0caad2..0000000 --- a/thinkphp/library/think/console/Command.php +++ /dev/null @@ -1,470 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console; - -use think\Console; -use think\console\input\Argument; -use think\console\input\Definition; -use think\console\input\Option; - -class Command -{ - - /** @var Console */ - private $console; - private $name; - private $aliases = []; - private $definition; - private $help; - private $description; - private $ignoreValidationErrors = false; - private $consoleDefinitionMerged = false; - private $consoleDefinitionMergedWithArgs = false; - private $code; - private $synopsis = []; - private $usages = []; - - /** @var Input */ - protected $input; - - /** @var Output */ - protected $output; - - /** - * 构造方法 - * @param string|null $name 命令名称,如果没有设置则比如在 configure() 里设置 - * @throws \LogicException - * @api - */ - public function __construct($name = null) - { - $this->definition = new Definition(); - - if (null !== $name) { - $this->setName($name); - } - - $this->configure(); - - if (!$this->name) { - throw new \LogicException(sprintf('The command defined in "%s" cannot have an empty name.', get_class($this))); - } - } - - /** - * 忽略验证错误 - */ - public function ignoreValidationErrors() - { - $this->ignoreValidationErrors = true; - } - - /** - * 设置控制台 - * @param Console $console - */ - public function setConsole(Console $console = null) - { - $this->console = $console; - } - - /** - * 获取控制台 - * @return Console - * @api - */ - public function getConsole() - { - return $this->console; - } - - /** - * 是否有效 - * @return bool - */ - public function isEnabled() - { - return true; - } - - /** - * 配置指令 - */ - protected function configure() - { - } - - /** - * 执行指令 - * @param Input $input - * @param Output $output - * @return null|int - * @throws \LogicException - * @see setCode() - */ - protected function execute(Input $input, Output $output) - { - throw new \LogicException('You must override the execute() method in the concrete command class.'); - } - - /** - * 用户验证 - * @param Input $input - * @param Output $output - */ - protected function interact(Input $input, Output $output) - { - } - - /** - * 初始化 - * @param Input $input An InputInterface instance - * @param Output $output An OutputInterface instance - */ - protected function initialize(Input $input, Output $output) - { - } - - /** - * 执行 - * @param Input $input - * @param Output $output - * @return int - * @throws \Exception - * @see setCode() - * @see execute() - */ - public function run(Input $input, Output $output) - { - $this->input = $input; - $this->output = $output; - - $this->getSynopsis(true); - $this->getSynopsis(false); - - $this->mergeConsoleDefinition(); - - try { - $input->bind($this->definition); - } catch (\Exception $e) { - if (!$this->ignoreValidationErrors) { - throw $e; - } - } - - $this->initialize($input, $output); - - if ($input->isInteractive()) { - $this->interact($input, $output); - } - - $input->validate(); - - if ($this->code) { - $statusCode = call_user_func($this->code, $input, $output); - } else { - $statusCode = $this->execute($input, $output); - } - - return is_numeric($statusCode) ? (int) $statusCode : 0; - } - - /** - * 设置执行代码 - * @param callable $code callable(InputInterface $input, OutputInterface $output) - * @return Command - * @throws \InvalidArgumentException - * @see execute() - */ - public function setCode(callable $code) - { - if (!is_callable($code)) { - throw new \InvalidArgumentException('Invalid callable provided to Command::setCode.'); - } - - if (PHP_VERSION_ID >= 50400 && $code instanceof \Closure) { - $r = new \ReflectionFunction($code); - if (null === $r->getClosureThis()) { - $code = \Closure::bind($code, $this); - } - } - - $this->code = $code; - - return $this; - } - - /** - * 合并参数定义 - * @param bool $mergeArgs - */ - public function mergeConsoleDefinition($mergeArgs = true) - { - if (null === $this->console - || (true === $this->consoleDefinitionMerged - && ($this->consoleDefinitionMergedWithArgs || !$mergeArgs)) - ) { - return; - } - - if ($mergeArgs) { - $currentArguments = $this->definition->getArguments(); - $this->definition->setArguments($this->console->getDefinition()->getArguments()); - $this->definition->addArguments($currentArguments); - } - - $this->definition->addOptions($this->console->getDefinition()->getOptions()); - - $this->consoleDefinitionMerged = true; - if ($mergeArgs) { - $this->consoleDefinitionMergedWithArgs = true; - } - } - - /** - * 设置参数定义 - * @param array|Definition $definition - * @return Command - * @api - */ - public function setDefinition($definition) - { - if ($definition instanceof Definition) { - $this->definition = $definition; - } else { - $this->definition->setDefinition($definition); - } - - $this->consoleDefinitionMerged = false; - - return $this; - } - - /** - * 获取参数定义 - * @return Definition - * @api - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * 获取当前指令的参数定义 - * @return Definition - */ - public function getNativeDefinition() - { - return $this->getDefinition(); - } - - /** - * 添加参数 - * @param string $name 名称 - * @param int $mode 类型 - * @param string $description 描述 - * @param mixed $default 默认值 - * @return Command - */ - public function addArgument($name, $mode = null, $description = '', $default = null) - { - $this->definition->addArgument(new Argument($name, $mode, $description, $default)); - - return $this; - } - - /** - * 添加选项 - * @param string $name 选项名称 - * @param string $shortcut 别名 - * @param int $mode 类型 - * @param string $description 描述 - * @param mixed $default 默认值 - * @return Command - */ - public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - $this->definition->addOption(new Option($name, $shortcut, $mode, $description, $default)); - - return $this; - } - - /** - * 设置指令名称 - * @param string $name - * @return Command - * @throws \InvalidArgumentException - */ - public function setName($name) - { - $this->validateName($name); - - $this->name = $name; - - return $this; - } - - /** - * 获取指令名称 - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * 设置描述 - * @param string $description - * @return Command - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * 获取描述 - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * 设置帮助信息 - * @param string $help - * @return Command - */ - public function setHelp($help) - { - $this->help = $help; - - return $this; - } - - /** - * 获取帮助信息 - * @return string - */ - public function getHelp() - { - return $this->help; - } - - /** - * 描述信息 - * @return string - */ - public function getProcessedHelp() - { - $name = $this->name; - - $placeholders = [ - '%command.name%', - '%command.full_name%', - ]; - $replacements = [ - $name, - $_SERVER['PHP_SELF'] . ' ' . $name, - ]; - - return str_replace($placeholders, $replacements, $this->getHelp()); - } - - /** - * 设置别名 - * @param string[] $aliases - * @return Command - * @throws \InvalidArgumentException - */ - public function setAliases($aliases) - { - if (!is_array($aliases) && !$aliases instanceof \Traversable) { - throw new \InvalidArgumentException('$aliases must be an array or an instance of \Traversable'); - } - - foreach ($aliases as $alias) { - $this->validateName($alias); - } - - $this->aliases = $aliases; - - return $this; - } - - /** - * 获取别名 - * @return array - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * 获取简介 - * @param bool $short 是否简单的 - * @return string - */ - public function getSynopsis($short = false) - { - $key = $short ? 'short' : 'long'; - - if (!isset($this->synopsis[$key])) { - $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short))); - } - - return $this->synopsis[$key]; - } - - /** - * 添加用法介绍 - * @param string $usage - * @return $this - */ - public function addUsage($usage) - { - if (0 !== strpos($usage, $this->name)) { - $usage = sprintf('%s %s', $this->name, $usage); - } - - $this->usages[] = $usage; - - return $this; - } - - /** - * 获取用法介绍 - * @return array - */ - public function getUsages() - { - return $this->usages; - } - - /** - * 验证指令名称 - * @param string $name - * @throws \InvalidArgumentException - */ - private function validateName($name) - { - if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { - throw new \InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); - } - } -} diff --git a/thinkphp/library/think/console/Input.php b/thinkphp/library/think/console/Input.php deleted file mode 100755 index 269196e..0000000 --- a/thinkphp/library/think/console/Input.php +++ /dev/null @@ -1,464 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console; - -use think\console\input\Argument; -use think\console\input\Definition; -use think\console\input\Option; - -class Input -{ - - /** - * @var Definition - */ - protected $definition; - - /** - * @var Option[] - */ - protected $options = []; - - /** - * @var Argument[] - */ - protected $arguments = []; - - protected $interactive = true; - - private $tokens; - private $parsed; - - public function __construct($argv = null) - { - if (null === $argv) { - $argv = $_SERVER['argv']; - // 去除命令名 - array_shift($argv); - } - - $this->tokens = $argv; - - $this->definition = new Definition(); - } - - protected function setTokens(array $tokens) - { - $this->tokens = $tokens; - } - - /** - * 绑定实例 - * @param Definition $definition A InputDefinition instance - */ - public function bind(Definition $definition) - { - $this->arguments = []; - $this->options = []; - $this->definition = $definition; - - $this->parse(); - } - - /** - * 解析参数 - */ - protected function parse() - { - $parseOptions = true; - $this->parsed = $this->tokens; - while (null !== $token = array_shift($this->parsed)) { - if ($parseOptions && '' == $token) { - $this->parseArgument($token); - } elseif ($parseOptions && '--' == $token) { - $parseOptions = false; - } elseif ($parseOptions && 0 === strpos($token, '--')) { - $this->parseLongOption($token); - } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { - $this->parseShortOption($token); - } else { - $this->parseArgument($token); - } - } - } - - /** - * 解析短选项 - * @param string $token 当前的指令. - */ - private function parseShortOption($token) - { - $name = substr($token, 1); - - if (strlen($name) > 1) { - if ($this->definition->hasShortcut($name[0]) - && $this->definition->getOptionForShortcut($name[0])->acceptValue() - ) { - $this->addShortOption($name[0], substr($name, 1)); - } else { - $this->parseShortOptionSet($name); - } - } else { - $this->addShortOption($name, null); - } - } - - /** - * 解析短选项 - * @param string $name 当前指令 - * @throws \RuntimeException - */ - private function parseShortOptionSet($name) - { - $len = strlen($name); - for ($i = 0; $i < $len; ++$i) { - if (!$this->definition->hasShortcut($name[$i])) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i])); - } - - $option = $this->definition->getOptionForShortcut($name[$i]); - if ($option->acceptValue()) { - $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); - - break; - } else { - $this->addLongOption($option->getName(), null); - } - } - } - - /** - * 解析完整选项 - * @param string $token 当前指令 - */ - private function parseLongOption($token) - { - $name = substr($token, 2); - - if (false !== $pos = strpos($name, '=')) { - $this->addLongOption(substr($name, 0, $pos), substr($name, $pos + 1)); - } else { - $this->addLongOption($name, null); - } - } - - /** - * 解析参数 - * @param string $token 当前指令 - * @throws \RuntimeException - */ - private function parseArgument($token) - { - $c = count($this->arguments); - - if ($this->definition->hasArgument($c)) { - $arg = $this->definition->getArgument($c); - - $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; - - } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { - $arg = $this->definition->getArgument($c - 1); - - $this->arguments[$arg->getName()][] = $token; - } else { - throw new \RuntimeException('Too many arguments.'); - } - } - - /** - * 添加一个短选项的值 - * @param string $shortcut 短名称 - * @param mixed $value 值 - * @throws \RuntimeException - */ - private function addShortOption($shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * 添加一个完整选项的值 - * @param string $name 选项名 - * @param mixed $value 值 - * @throws \RuntimeException - */ - private function addLongOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \RuntimeException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (false === $value) { - $value = null; - } - - if (null !== $value && !$option->acceptValue()) { - throw new \RuntimeException(sprintf('The "--%s" option does not accept a value.', $name, $value)); - } - - if (null === $value && $option->acceptValue() && count($this->parsed)) { - $next = array_shift($this->parsed); - if (isset($next[0]) && '-' !== $next[0]) { - $value = $next; - } elseif (empty($next)) { - $value = ''; - } else { - array_unshift($this->parsed, $next); - } - } - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \RuntimeException(sprintf('The "--%s" option requires a value.', $name)); - } - - if (!$option->isArray()) { - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - } - - if ($option->isArray()) { - $this->options[$name][] = $value; - } else { - $this->options[$name] = $value; - } - } - - /** - * 获取第一个参数 - * @return string|null - */ - public function getFirstArgument() - { - foreach ($this->tokens as $token) { - if ($token && '-' === $token[0]) { - continue; - } - - return $token; - } - return null; - } - - /** - * 检查原始参数是否包含某个值 - * @param string|array $values 需要检查的值 - * @return bool - */ - public function hasParameterOption($values) - { - $values = (array) $values; - - foreach ($this->tokens as $token) { - foreach ($values as $value) { - if ($token === $value || 0 === strpos($token, $value . '=')) { - return true; - } - } - } - - return false; - } - - /** - * 获取原始选项的值 - * @param string|array $values 需要检查的值 - * @param mixed $default 默认值 - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - $tokens = $this->tokens; - - while (0 < count($tokens)) { - $token = array_shift($tokens); - - foreach ($values as $value) { - if ($token === $value || 0 === strpos($token, $value . '=')) { - if (false !== $pos = strpos($token, '=')) { - return substr($token, $pos + 1); - } - - return array_shift($tokens); - } - } - } - - return $default; - } - - /** - * 验证输入 - * @throws \RuntimeException - */ - public function validate() - { - if (count($this->arguments) < $this->definition->getArgumentRequiredCount()) { - throw new \RuntimeException('Not enough arguments.'); - } - } - - /** - * 检查输入是否是交互的 - * @return bool - */ - public function isInteractive() - { - return $this->interactive; - } - - /** - * 设置输入的交互 - * @param bool - */ - public function setInteractive($interactive) - { - $this->interactive = (bool) $interactive; - } - - /** - * 获取所有的参数 - * @return Argument[] - */ - public function getArguments() - { - return array_merge($this->definition->getArgumentDefaults(), $this->arguments); - } - - /** - * 根据名称获取参数 - * @param string $name 参数名 - * @return mixed - * @throws \InvalidArgumentException - */ - public function getArgument($name) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name) - ->getDefault(); - } - - /** - * 设置参数的值 - * @param string $name 参数名 - * @param string $value 值 - * @throws \InvalidArgumentException - */ - public function setArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } - - /** - * 检查是否存在某个参数 - * @param string|int $name 参数名或位置 - * @return bool - */ - public function hasArgument($name) - { - return $this->definition->hasArgument($name); - } - - /** - * 获取所有的选项 - * @return Option[] - */ - public function getOptions() - { - return array_merge($this->definition->getOptionDefaults(), $this->options); - } - - /** - * 获取选项值 - * @param string $name 选项名称 - * @return mixed - * @throws \InvalidArgumentException - */ - public function getOption($name) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - return isset($this->options[$name]) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); - } - - /** - * 设置选项值 - * @param string $name 选项名 - * @param string|bool $value 值 - * @throws \InvalidArgumentException - */ - public function setOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - $this->options[$name] = $value; - } - - /** - * 是否有某个选项 - * @param string $name 选项名 - * @return bool - */ - public function hasOption($name) - { - return $this->definition->hasOption($name) && isset($this->options[$name]); - } - - /** - * 转义指令 - * @param string $token - * @return string - */ - public function escapeToken($token) - { - return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); - } - - /** - * 返回传递给命令的参数的字符串 - * @return string - */ - public function __toString() - { - $tokens = array_map(function ($token) { - if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { - return $match[1] . $this->escapeToken($match[2]); - } - - if ($token && '-' !== $token[0]) { - return $this->escapeToken($token); - } - - return $token; - }, $this->tokens); - - return implode(' ', $tokens); - } -} diff --git a/thinkphp/library/think/console/LICENSE b/thinkphp/library/think/console/LICENSE deleted file mode 100755 index 0abe056..0000000 --- a/thinkphp/library/think/console/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2016 Fabien Potencier - -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. \ No newline at end of file diff --git a/thinkphp/library/think/console/Output.php b/thinkphp/library/think/console/Output.php deleted file mode 100755 index 65dc9fb..0000000 --- a/thinkphp/library/think/console/Output.php +++ /dev/null @@ -1,222 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console; - -use Exception; -use think\console\output\Ask; -use think\console\output\Descriptor; -use think\console\output\driver\Buffer; -use think\console\output\driver\Console; -use think\console\output\driver\Nothing; -use think\console\output\Question; -use think\console\output\question\Choice; -use think\console\output\question\Confirmation; - -/** - * Class Output - * @package think\console - * - * @see \think\console\output\driver\Console::setDecorated - * @method void setDecorated($decorated) - * - * @see \think\console\output\driver\Buffer::fetch - * @method string fetch() - * - * @method void info($message) - * @method void error($message) - * @method void comment($message) - * @method void warning($message) - * @method void highlight($message) - * @method void question($message) - */ -class Output -{ - const VERBOSITY_QUIET = 0; - const VERBOSITY_NORMAL = 1; - const VERBOSITY_VERBOSE = 2; - const VERBOSITY_VERY_VERBOSE = 3; - const VERBOSITY_DEBUG = 4; - - const OUTPUT_NORMAL = 0; - const OUTPUT_RAW = 1; - const OUTPUT_PLAIN = 2; - - private $verbosity = self::VERBOSITY_NORMAL; - - /** @var Buffer|Console|Nothing */ - private $handle = null; - - protected $styles = [ - 'info', - 'error', - 'comment', - 'question', - 'highlight', - 'warning' - ]; - - public function __construct($driver = 'console') - { - $class = '\\think\\console\\output\\driver\\' . ucwords($driver); - - $this->handle = new $class($this); - } - - public function ask(Input $input, $question, $default = null, $validator = null) - { - $question = new Question($question, $default); - $question->setValidator($validator); - - return $this->askQuestion($input, $question); - } - - public function askHidden(Input $input, $question, $validator = null) - { - $question = new Question($question); - - $question->setHidden(true); - $question->setValidator($validator); - - return $this->askQuestion($input, $question); - } - - public function confirm(Input $input, $question, $default = true) - { - return $this->askQuestion($input, new Confirmation($question, $default)); - } - - /** - * {@inheritdoc} - */ - public function choice(Input $input, $question, array $choices, $default = null) - { - if (null !== $default) { - $values = array_flip($choices); - $default = $values[$default]; - } - - return $this->askQuestion($input, new Choice($question, $choices, $default)); - } - - protected function askQuestion(Input $input, Question $question) - { - $ask = new Ask($input, $this, $question); - $answer = $ask->run(); - - if ($input->isInteractive()) { - $this->newLine(); - } - - return $answer; - } - - protected function block($style, $message) - { - $this->writeln("<{$style}>{$message}</$style>"); - } - - /** - * 输出空行 - * @param int $count - */ - public function newLine($count = 1) - { - $this->write(str_repeat(PHP_EOL, $count)); - } - - /** - * 输出信息并换行 - * @param string $messages - * @param int $type - */ - public function writeln($messages, $type = self::OUTPUT_NORMAL) - { - $this->write($messages, true, $type); - } - - /** - * 输出信息 - * @param string $messages - * @param bool $newline - * @param int $type - */ - public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) - { - $this->handle->write($messages, $newline, $type); - } - - public function renderException(\Exception $e) - { - $this->handle->renderException($e); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - $this->verbosity = (int) $level; - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return $this->verbosity; - } - - public function isQuiet() - { - return self::VERBOSITY_QUIET === $this->verbosity; - } - - public function isVerbose() - { - return self::VERBOSITY_VERBOSE <= $this->verbosity; - } - - public function isVeryVerbose() - { - return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; - } - - public function isDebug() - { - return self::VERBOSITY_DEBUG <= $this->verbosity; - } - - public function describe($object, array $options = []) - { - $descriptor = new Descriptor(); - $options = array_merge([ - 'raw_text' => false, - ], $options); - - $descriptor->describe($this, $object, $options); - } - - public function __call($method, $args) - { - if (in_array($method, $this->styles)) { - array_unshift($args, $method); - return call_user_func_array([$this, 'block'], $args); - } - - if ($this->handle && method_exists($this->handle, $method)) { - return call_user_func_array([$this->handle, $method], $args); - } else { - throw new Exception('method not exists:' . __CLASS__ . '->' . $method); - } - } - -} diff --git a/thinkphp/library/think/console/bin/README.md b/thinkphp/library/think/console/bin/README.md deleted file mode 100755 index 9acc52f..0000000 --- a/thinkphp/library/think/console/bin/README.md +++ /dev/null @@ -1 +0,0 @@ -console 工具使用 hiddeninput.exe 在 windows 上隐藏密码输入,该二进制文件由第三方提供,相关源码和其他细节可以在 [Hidden Input](https://github.com/Seldaek/hidden-input) 找到。 diff --git a/thinkphp/library/think/console/bin/hiddeninput.exe b/thinkphp/library/think/console/bin/hiddeninput.exe deleted file mode 100755 index c8cf65e8d819e6e525121cf6b21f1c2429746038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 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 J0sQ~1{4brj`U(I5 diff --git a/thinkphp/library/think/console/command/Build.php b/thinkphp/library/think/console/command/Build.php deleted file mode 100755 index 39806c3..0000000 --- a/thinkphp/library/think/console/command/Build.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Option; -use think\console\Output; - -class Build extends Command -{ - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->setName('build') - ->setDefinition([ - new Option('config', null, Option::VALUE_OPTIONAL, "build.php path"), - new Option('module', null, Option::VALUE_OPTIONAL, "module name"), - ]) - ->setDescription('Build Application Dirs'); - } - - protected function execute(Input $input, Output $output) - { - if ($input->hasOption('module')) { - \think\Build::module($input->getOption('module')); - $output->writeln("Successed"); - return; - } - - if ($input->hasOption('config')) { - $build = include $input->getOption('config'); - } else { - $build = include APP_PATH . 'build.php'; - } - if (empty($build)) { - $output->writeln("Build Config Is Empty"); - return; - } - \think\Build::run($build); - $output->writeln("Successed"); - - } -} diff --git a/thinkphp/library/think/console/command/Clear.php b/thinkphp/library/think/console/command/Clear.php deleted file mode 100755 index 020febd..0000000 --- a/thinkphp/library/think/console/command/Clear.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Option; -use think\console\Output; - -class Clear extends Command -{ - protected function configure() - { - // 指令配置 - $this - ->setName('clear') - ->addOption('path', 'd', Option::VALUE_OPTIONAL, 'path to clear', null) - ->setDescription('Clear runtime file'); - } - - protected function execute(Input $input, Output $output) - { - $path = $input->getOption('path') ?: RUNTIME_PATH; - $files = scandir($path); - if ($files) { - foreach ($files as $file) { - if ('.' != $file && '..' != $file && is_dir($path . $file)) { - array_map('unlink', glob($path . $file . '/*.*')); - } elseif (is_file($path . $file)) { - unlink($path . $file); - } - } - } - $output->writeln("<info>Clear Successed</info>"); - } -} diff --git a/thinkphp/library/think/console/command/Help.php b/thinkphp/library/think/console/command/Help.php deleted file mode 100755 index eb0858a..0000000 --- a/thinkphp/library/think/console/command/Help.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument as InputArgument; -use think\console\input\Option as InputOption; -use think\console\Output; -use think\console\helper\Descriptor as DescriptorHelper; - -class Help extends Command -{ - - private $command; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->ignoreValidationErrors(); - - $this->setName('help')->setDefinition([ - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'), - ])->setDescription('Displays help for a command')->setHelp(<<<EOF -The <info>%command.name%</info> command displays help for a given command: - - <info>php %command.full_name% list</info> - -To display the list of available commands, please use the <info>list</info> command. -EOF - ); - } - - /** - * Sets the command. - * @param Command $command The command to set - */ - public function setCommand(Command $command) - { - $this->command = $command; - } - - /** - * {@inheritdoc} - */ - protected function execute(Input $input, Output $output) - { - if (null === $this->command) { - $this->command = $this->getConsole()->find($input->getArgument('command_name')); - } - - $output->describe($this->command, [ - 'raw_text' => $input->getOption('raw'), - ]); - - $this->command = null; - } -} \ No newline at end of file diff --git a/thinkphp/library/think/console/command/Lists.php b/thinkphp/library/think/console/command/Lists.php deleted file mode 100755 index ffbee07..0000000 --- a/thinkphp/library/think/console/command/Lists.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\Output; -use think\console\input\Argument as InputArgument; -use think\console\input\Option as InputOption; -use think\console\input\Definition as InputDefinition; - -class Lists extends Command -{ - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->setName('list')->setDefinition($this->createDefinition())->setDescription('Lists commands')->setHelp(<<<EOF -The <info>%command.name%</info> command lists all commands: - - <info>php %command.full_name%</info> - -You can also display the commands for a specific namespace: - - <info>php %command.full_name% test</info> - -It's also possible to get raw list of commands (useful for embedding command runner): - - <info>php %command.full_name% --raw</info> -EOF - ); - } - - /** - * {@inheritdoc} - */ - public function getNativeDefinition() - { - return $this->createDefinition(); - } - - /** - * {@inheritdoc} - */ - protected function execute(Input $input, Output $output) - { - $output->describe($this->getConsole(), [ - 'raw_text' => $input->getOption('raw'), - 'namespace' => $input->getArgument('namespace'), - ]); - } - - /** - * {@inheritdoc} - */ - private function createDefinition() - { - return new InputDefinition([ - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list') - ]); - } -} \ No newline at end of file diff --git a/thinkphp/library/think/console/command/Make.php b/thinkphp/library/think/console/command/Make.php deleted file mode 100755 index b508f8d..0000000 --- a/thinkphp/library/think/console/command/Make.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 刘志淳 <chun@engineer.com> -// +---------------------------------------------------------------------- - -namespace think\console\command; - -use think\Config; -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\Output; - -abstract class Make extends Command -{ - - protected $type; - - abstract protected function getStub(); - - protected function configure() - { - $this->addArgument('name', Argument::REQUIRED, "The name of the class"); - } - - protected function execute(Input $input, Output $output) - { - - $name = trim($input->getArgument('name')); - - $classname = $this->getClassName($name); - - $pathname = $this->getPathName($classname); - - if (is_file($pathname)) { - $output->writeln('<error>' . $this->type . ' already exists!</error>'); - return false; - } - - if (!is_dir(dirname($pathname))) { - mkdir(strtolower(dirname($pathname)), 0755, true); - } - - file_put_contents($pathname, $this->buildClass($classname)); - - $output->writeln('<info>' . $this->type . ' created successfully.</info>'); - - } - - protected function buildClass($name) - { - $stub = file_get_contents($this->getStub()); - - $namespace = trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\'); - - $class = str_replace($namespace . '\\', '', $name); - - return str_replace(['{%className%}', '{%namespace%}', '{%app_namespace%}'], [ - $class, - $namespace, - Config::get('app_namespace') - ], $stub); - - } - - protected function getPathName($name) - { - $name = str_replace(Config::get('app_namespace') . '\\', '', $name); - - return APP_PATH . str_replace('\\', '/', $name) . '.php'; - } - - protected function getClassName($name) - { - $appNamespace = Config::get('app_namespace'); - - if (strpos($name, $appNamespace . '\\') === 0) { - return $name; - } - - if (Config::get('app_multi_module')) { - if (strpos($name, '/')) { - list($module, $name) = explode('/', $name, 2); - } else { - $module = 'common'; - } - } else { - $module = null; - } - - if (strpos($name, '/') !== false) { - $name = str_replace('/', '\\', $name); - } - - return $this->getNamespace($appNamespace, $module) . '\\' . $name; - } - - protected function getNamespace($appNamespace, $module) - { - return $module ? ($appNamespace . '\\' . $module) : $appNamespace; - } - -} diff --git a/thinkphp/library/think/console/command/make/Controller.php b/thinkphp/library/think/console/command/make/Controller.php deleted file mode 100755 index afa7be9..0000000 --- a/thinkphp/library/think/console/command/make/Controller.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 刘志淳 <chun@engineer.com> -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\Config; -use think\console\command\Make; -use think\console\input\Option; - -class Controller extends Make -{ - - protected $type = "Controller"; - - protected function configure() - { - parent::configure(); - $this->setName('make:controller') - ->addOption('plain', null, Option::VALUE_NONE, 'Generate an empty controller class.') - ->setDescription('Create a new resource controller class'); - } - - protected function getStub() - { - if ($this->input->getOption('plain')) { - return __DIR__ . '/stubs/controller.plain.stub'; - } - - return __DIR__ . '/stubs/controller.stub'; - } - - protected function getClassName($name) - { - return parent::getClassName($name) . (Config::get('controller_suffix') ? ucfirst(Config::get('url_controller_layer')) : ''); - } - - protected function getNamespace($appNamespace, $module) - { - return parent::getNamespace($appNamespace, $module) . '\controller'; - } - -} diff --git a/thinkphp/library/think/console/command/make/Model.php b/thinkphp/library/think/console/command/make/Model.php deleted file mode 100755 index d4e9b5d..0000000 --- a/thinkphp/library/think/console/command/make/Model.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 刘志淳 <chun@engineer.com> -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\console\command\Make; - -class Model extends Make -{ - protected $type = "Model"; - - protected function configure() - { - parent::configure(); - $this->setName('make:model') - ->setDescription('Create a new model class'); - } - - protected function getStub() - { - return __DIR__ . '/stubs/model.stub'; - } - - protected function getNamespace($appNamespace, $module) - { - return parent::getNamespace($appNamespace, $module) . '\model'; - } -} diff --git a/thinkphp/library/think/console/command/make/stubs/controller.plain.stub b/thinkphp/library/think/console/command/make/stubs/controller.plain.stub deleted file mode 100755 index b7539dc..0000000 --- a/thinkphp/library/think/console/command/make/stubs/controller.plain.stub +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -namespace {%namespace%}; - -use think\Controller; - -class {%className%} extends Controller -{ - // -} diff --git a/thinkphp/library/think/console/command/make/stubs/controller.stub b/thinkphp/library/think/console/command/make/stubs/controller.stub deleted file mode 100755 index 870ce5c..0000000 --- a/thinkphp/library/think/console/command/make/stubs/controller.stub +++ /dev/null @@ -1,85 +0,0 @@ -<?php - -namespace {%namespace%}; - -use think\Controller; -use think\Request; - -class {%className%} extends Controller -{ - /** - * 显示资源列表 - * - * @return \think\Response - */ - public function index() - { - // - } - - /** - * 显示创建资源表单页. - * - * @return \think\Response - */ - public function create() - { - // - } - - /** - * 保存新建的资源 - * - * @param \think\Request $request - * @return \think\Response - */ - public function save(Request $request) - { - // - } - - /** - * 显示指定的资源 - * - * @param int $id - * @return \think\Response - */ - public function read($id) - { - // - } - - /** - * 显示编辑资源表单页. - * - * @param int $id - * @return \think\Response - */ - public function edit($id) - { - // - } - - /** - * 保存更新的资源 - * - * @param \think\Request $request - * @param int $id - * @return \think\Response - */ - public function update(Request $request, $id) - { - // - } - - /** - * 删除指定资源 - * - * @param int $id - * @return \think\Response - */ - public function delete($id) - { - // - } -} diff --git a/thinkphp/library/think/console/command/make/stubs/model.stub b/thinkphp/library/think/console/command/make/stubs/model.stub deleted file mode 100755 index 2b719ba..0000000 --- a/thinkphp/library/think/console/command/make/stubs/model.stub +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -namespace {%namespace%}; - -use think\Model; - -class {%className%} extends Model -{ - // -} diff --git a/thinkphp/library/think/console/command/optimize/Autoload.php b/thinkphp/library/think/console/command/optimize/Autoload.php deleted file mode 100755 index 0481e17..0000000 --- a/thinkphp/library/think/console/command/optimize/Autoload.php +++ /dev/null @@ -1,281 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- -namespace think\console\command\optimize; - -use think\App; -use think\console\Command; -use think\console\Input; -use think\console\Output; - -class Autoload extends Command -{ - - protected function configure() - { - $this->setName('optimize:autoload') - ->setDescription('Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.'); - } - - protected function execute(Input $input, Output $output) - { - - $classmapFile = <<<EOF -<?php -/** - * 类库映射 - */ - -return [ - -EOF; - - $namespacesToScan = [ - App::$namespace . '\\' => realpath(rtrim(APP_PATH)), - 'think\\' => LIB_PATH . 'think', - 'behavior\\' => LIB_PATH . 'behavior', - 'traits\\' => LIB_PATH . 'traits', - '' => realpath(rtrim(EXTEND_PATH)) - ]; - - krsort($namespacesToScan); - $classMap = []; - foreach ($namespacesToScan as $namespace => $dir) { - - if (!is_dir($dir)) { - continue; - } - - $namespaceFilter = $namespace === '' ? null : $namespace; - $classMap = $this->addClassMapCode($dir, $namespaceFilter, $classMap); - } - - ksort($classMap); - foreach ($classMap as $class => $code) { - $classmapFile .= ' ' . var_export($class, true) . ' => ' . $code; - } - $classmapFile .= "];\n"; - - if (!is_dir(RUNTIME_PATH)) { - @mkdir(RUNTIME_PATH, 0755, true); - } - - file_put_contents(RUNTIME_PATH . 'classmap' . EXT, $classmapFile); - - $output->writeln('<info>Succeed!</info>'); - } - - protected function addClassMapCode($dir, $namespace, $classMap) - { - foreach ($this->createMap($dir, $namespace) as $class => $path) { - - $pathCode = $this->getPathCode($path) . ",\n"; - - if (!isset($classMap[$class])) { - $classMap[$class] = $pathCode; - } elseif ($classMap[$class] !== $pathCode && !preg_match('{/(test|fixture|example|stub)s?/}i', strtr($classMap[$class] . ' ' . $path, '\\', '/'))) { - $this->output->writeln( - '<warning>Warning: Ambiguous class resolution, "' . $class . '"' . - ' was found in both "' . str_replace(["',\n"], [ - '' - ], $classMap[$class]) . '" and "' . $path . '", the first will be used.</warning>' - ); - } - } - return $classMap; - } - - protected function getPathCode($path) - { - - $baseDir = ''; - $appPath = $this->normalizePath(realpath(APP_PATH)); - $libPath = $this->normalizePath(realpath(LIB_PATH)); - $extendPath = $this->normalizePath(realpath(EXTEND_PATH)); - $path = $this->normalizePath($path); - - if (strpos($path, $libPath . '/') === 0) { - $path = substr($path, strlen(LIB_PATH)); - $baseDir = 'LIB_PATH'; - } elseif (strpos($path, $appPath . '/') === 0) { - $path = substr($path, strlen($appPath) + 1); - $baseDir = 'APP_PATH'; - } elseif (strpos($path, $extendPath . '/') === 0) { - $path = substr($path, strlen($extendPath) + 1); - $baseDir = 'EXTEND_PATH'; - } - - if ($path !== false) { - $baseDir .= " . "; - } - - return $baseDir . (($path !== false) ? var_export($path, true) : ""); - } - - protected function normalizePath($path) - { - $parts = []; - $path = strtr($path, '\\', '/'); - $prefix = ''; - $absolute = false; - - if (preg_match('{^([0-9a-z]+:(?://(?:[a-z]:)?)?)}i', $path, $match)) { - $prefix = $match[1]; - $path = substr($path, strlen($prefix)); - } - - if (substr($path, 0, 1) === '/') { - $absolute = true; - $path = substr($path, 1); - } - - $up = false; - foreach (explode('/', $path) as $chunk) { - if ('..' === $chunk && ($absolute || $up)) { - array_pop($parts); - $up = !(empty($parts) || '..' === end($parts)); - } elseif ('.' !== $chunk && '' !== $chunk) { - $parts[] = $chunk; - $up = '..' !== $chunk; - } - } - - return $prefix . ($absolute ? '/' : '') . implode('/', $parts); - } - - protected function createMap($path, $namespace = null) - { - if (is_string($path)) { - if (is_file($path)) { - $path = [new \SplFileInfo($path)]; - } elseif (is_dir($path)) { - - $objects = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::SELF_FIRST); - - $path = []; - - /** @var \SplFileInfo $object */ - foreach ($objects as $object) { - if ($object->isFile() && $object->getExtension() == 'php') { - $path[] = $object; - } - } - } else { - throw new \RuntimeException( - 'Could not scan for classes inside "' . $path . - '" which does not appear to be a file nor a folder' - ); - } - } - - $map = []; - - /** @var \SplFileInfo $file */ - foreach ($path as $file) { - $filePath = $file->getRealPath(); - - if (pathinfo($filePath, PATHINFO_EXTENSION) != 'php') { - continue; - } - - $classes = $this->findClasses($filePath); - - foreach ($classes as $class) { - if (null !== $namespace && 0 !== strpos($class, $namespace)) { - continue; - } - - if (!isset($map[$class])) { - $map[$class] = $filePath; - } elseif ($map[$class] !== $filePath && !preg_match('{/(test|fixture|example|stub)s?/}i', strtr($map[$class] . ' ' . $filePath, '\\', '/'))) { - $this->output->writeln( - '<warning>Warning: Ambiguous class resolution, "' . $class . '"' . - ' was found in both "' . $map[$class] . '" and "' . $filePath . '", the first will be used.</warning>' - ); - } - } - } - - return $map; - } - - protected function findClasses($path) - { - $extraTypes = '|trait'; - - $contents = @php_strip_whitespace($path); - if (!$contents) { - if (!file_exists($path)) { - $message = 'File at "%s" does not exist, check your classmap definitions'; - } elseif (!is_readable($path)) { - $message = 'File at "%s" is not readable, check its permissions'; - } elseif ('' === trim(file_get_contents($path))) { - return []; - } else { - $message = 'File at "%s" could not be parsed as PHP, it may be binary or corrupted'; - } - $error = error_get_last(); - if (isset($error['message'])) { - $message .= PHP_EOL . 'The following message may be helpful:' . PHP_EOL . $error['message']; - } - throw new \RuntimeException(sprintf($message, $path)); - } - - if (!preg_match('{\b(?:class|interface' . $extraTypes . ')\s}i', $contents)) { - return []; - } - - // strip heredocs/nowdocs - $contents = preg_replace('{<<<\s*(\'?)(\w+)\\1(?:\r\n|\n|\r)(?:.*?)(?:\r\n|\n|\r)\\2(?=\r\n|\n|\r|;)}s', 'null', $contents); - // strip strings - $contents = preg_replace('{"[^"\\\\]*+(\\\\.[^"\\\\]*+)*+"|\'[^\'\\\\]*+(\\\\.[^\'\\\\]*+)*+\'}s', 'null', $contents); - // strip leading non-php code if needed - if (substr($contents, 0, 2) !== '<?') { - $contents = preg_replace('{^.+?<\?}s', '<?', $contents, 1, $replacements); - if ($replacements === 0) { - return []; - } - } - // strip non-php blocks in the file - $contents = preg_replace('{\?>.+<\?}s', '?><?', $contents); - // strip trailing non-php code if needed - $pos = strrpos($contents, '?>'); - if (false !== $pos && false === strpos(substr($contents, $pos), '<?')) { - $contents = substr($contents, 0, $pos); - } - - preg_match_all('{ - (?: - \b(?<![\$:>])(?P<type>class|interface' . $extraTypes . ') \s++ (?P<name>[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*+) - | \b(?<![\$:>])(?P<ns>namespace) (?P<nsname>\s++[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\s*+\\\\\s*+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+)? \s*+ [\{;] - ) - }ix', $contents, $matches); - - $classes = []; - $namespace = ''; - - for ($i = 0, $len = count($matches['type']); $i < $len; $i++) { - if (!empty($matches['ns'][$i])) { - $namespace = str_replace([' ', "\t", "\r", "\n"], '', $matches['nsname'][$i]) . '\\'; - } else { - $name = $matches['name'][$i]; - if ($name[0] === ':') { - $name = 'xhp' . substr(str_replace(['-', ':'], ['_', '__'], $name), 1); - } elseif ($matches['type'][$i] === 'enum') { - $name = rtrim($name, ':'); - } - $classes[] = ltrim($namespace . $name, '\\'); - } - } - - return $classes; - } - -} \ No newline at end of file diff --git a/thinkphp/library/think/console/command/optimize/Config.php b/thinkphp/library/think/console/command/optimize/Config.php deleted file mode 100755 index cadfe5e..0000000 --- a/thinkphp/library/think/console/command/optimize/Config.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- -namespace think\console\command\optimize; - -use think\Config as ThinkConfig; -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\Output; - -class Config extends Command -{ - /** @var Output */ - protected $output; - - protected function configure() - { - $this->setName('optimize:config') - ->addArgument('module', Argument::OPTIONAL, 'Build module config cache .') - ->setDescription('Build config and common file cache.'); - } - - protected function execute(Input $input, Output $output) - { - if ($input->hasArgument('module')) { - $module = $input->getArgument('module') . DS; - } else { - $module = ''; - } - - $content = '<?php ' . PHP_EOL . $this->buildCacheContent($module); - - if (!is_dir(RUNTIME_PATH . $module)) { - @mkdir(RUNTIME_PATH . $module, 0755, true); - } - - file_put_contents(RUNTIME_PATH . $module . 'init' . EXT, $content); - - $output->writeln('<info>Succeed!</info>'); - } - - protected function buildCacheContent($module) - { - $content = ''; - $path = realpath(APP_PATH . $module) . DS; - - if ($module) { - // 加载模块配置 - $config = ThinkConfig::load(CONF_PATH . $module . 'config' . CONF_EXT); - - // 读取数据库配置文件 - $filename = CONF_PATH . $module . 'database' . CONF_EXT; - ThinkConfig::load($filename, 'database'); - - // 加载应用状态配置 - if ($config['app_status']) { - $config = ThinkConfig::load(CONF_PATH . $module . $config['app_status'] . CONF_EXT); - } - // 读取扩展配置文件 - if (is_dir(CONF_PATH . $module . 'extra')) { - $dir = CONF_PATH . $module . 'extra'; - $files = scandir($dir); - foreach ($files as $file) { - if (strpos($file, CONF_EXT)) { - $filename = $dir . DS . $file; - ThinkConfig::load($filename, pathinfo($file, PATHINFO_FILENAME)); - } - } - } - } - - // 加载行为扩展文件 - if (is_file(CONF_PATH . $module . 'tags' . EXT)) { - $content .= '\think\Hook::import(' . (var_export(include CONF_PATH . $module . 'tags' . EXT, true)) . ');' . PHP_EOL; - } - - // 加载公共文件 - if (is_file($path . 'common' . EXT)) { - $content .= substr(php_strip_whitespace($path . 'common' . EXT), 5) . PHP_EOL; - } - - $content .= '\think\Config::set(' . var_export(ThinkConfig::get(), true) . ');'; - return $content; - } -} diff --git a/thinkphp/library/think/console/command/optimize/Route.php b/thinkphp/library/think/console/command/optimize/Route.php deleted file mode 100755 index 911e4c1..0000000 --- a/thinkphp/library/think/console/command/optimize/Route.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- -namespace think\console\command\optimize; - -use think\console\Command; -use think\console\Input; -use think\console\Output; - -class Route extends Command -{ - /** @var Output */ - protected $output; - - protected function configure() - { - $this->setName('optimize:route') - ->setDescription('Build route cache.'); - } - - protected function execute(Input $input, Output $output) - { - file_put_contents(RUNTIME_PATH . 'route.php', $this->buildRouteCache()); - $output->writeln('<info>Succeed!</info>'); - } - - protected function buildRouteCache() - { - $files = \think\Config::get('route_config_file'); - foreach ($files as $file) { - if (is_file(CONF_PATH . $file . CONF_EXT)) { - $config = include CONF_PATH . $file . CONF_EXT; - if (is_array($config)) { - \think\Route::import($config); - } - } - } - $rules = \think\Route::rules(true); - array_walk_recursive($rules, [$this, 'buildClosure']); - $content = '<?php ' . PHP_EOL . 'return '; - $content .= var_export($rules, true) . ';'; - $content = str_replace(['\'[__start__', '__end__]\''], '', stripcslashes($content)); - return $content; - } - - protected function buildClosure(&$value) - { - if ($value instanceof \Closure) { - $reflection = new \ReflectionFunction($value); - $startLine = $reflection->getStartLine(); - $endLine = $reflection->getEndLine(); - $file = $reflection->getFileName(); - $item = file($file); - $content = ''; - for ($i = $startLine - 1; $i <= $endLine - 1; $i++) { - $content .= $item[$i]; - } - $start = strpos($content, 'function'); - $end = strrpos($content, '}'); - $value = '[__start__' . substr($content, $start, $end - $start + 1) . '__end__]'; - } - } -} diff --git a/thinkphp/library/think/console/command/optimize/Schema.php b/thinkphp/library/think/console/command/optimize/Schema.php deleted file mode 100755 index a1f40cd..0000000 --- a/thinkphp/library/think/console/command/optimize/Schema.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- -namespace think\console\command\optimize; - -use think\App; -use think\console\Command; -use think\console\Input; -use think\console\input\Option; -use think\console\Output; -use think\Db; - -class Schema extends Command -{ - /** @var Output */ - protected $output; - - protected function configure() - { - $this->setName('optimize:schema') - ->addOption('db', null, Option::VALUE_REQUIRED, 'db name .') - ->addOption('table', null, Option::VALUE_REQUIRED, 'table name .') - ->addOption('module', null, Option::VALUE_REQUIRED, 'module name .') - ->setDescription('Build database schema cache.'); - } - - protected function execute(Input $input, Output $output) - { - if (!is_dir(RUNTIME_PATH . 'schema')) { - @mkdir(RUNTIME_PATH . 'schema', 0755, true); - } - if ($input->hasOption('module')) { - $module = $input->getOption('module'); - // 读取模型 - $list = scandir(APP_PATH . $module . DS . 'model'); - $app = App::$namespace; - foreach ($list as $file) { - if ('.' == $file || '..' == $file) { - continue; - } - $class = '\\' . $app . '\\' . $module . '\\model\\' . pathinfo($file, PATHINFO_FILENAME); - $this->buildModelSchema($class); - } - $output->writeln('<info>Succeed!</info>'); - return; - } else if ($input->hasOption('table')) { - $table = $input->getOption('table'); - if (!strpos($table, '.')) { - $dbName = Db::getConfig('database'); - } - $tables[] = $table; - } elseif ($input->hasOption('db')) { - $dbName = $input->getOption('db'); - $tables = Db::getTables($dbName); - } elseif (!\think\Config::get('app_multi_module')) { - $app = App::$namespace; - $list = scandir(APP_PATH . 'model'); - foreach ($list as $file) { - if ('.' == $file || '..' == $file) { - continue; - } - $class = '\\' . $app . '\\model\\' . pathinfo($file, PATHINFO_FILENAME); - $this->buildModelSchema($class); - } - $output->writeln('<info>Succeed!</info>'); - return; - } else { - $tables = Db::getTables(); - } - - $db = isset($dbName) ? $dbName . '.' : ''; - $this->buildDataBaseSchema($tables, $db); - - $output->writeln('<info>Succeed!</info>'); - } - - protected function buildModelSchema($class) - { - $reflect = new \ReflectionClass($class); - if (!$reflect->isAbstract() && $reflect->isSubclassOf('\think\Model')) { - $table = $class::getTable(); - $dbName = $class::getConfig('database'); - $content = '<?php ' . PHP_EOL . 'return '; - $info = $class::getConnection()->getFields($table); - $content .= var_export($info, true) . ';'; - file_put_contents(RUNTIME_PATH . 'schema' . DS . $dbName . '.' . $table . EXT, $content); - } - } - - protected function buildDataBaseSchema($tables, $db) - { - if ('' == $db) { - $dbName = Db::getConfig('database') . '.'; - } else { - $dbName = $db; - } - foreach ($tables as $table) { - $content = '<?php ' . PHP_EOL . 'return '; - $info = Db::getFields($db . $table); - $content .= var_export($info, true) . ';'; - file_put_contents(RUNTIME_PATH . 'schema' . DS . $dbName . $table . EXT, $content); - } - } -} diff --git a/thinkphp/library/think/console/input/Argument.php b/thinkphp/library/think/console/input/Argument.php deleted file mode 100755 index 16223bb..0000000 --- a/thinkphp/library/think/console/input/Argument.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\input; - -class Argument -{ - - const REQUIRED = 1; - const OPTIONAL = 2; - const IS_ARRAY = 4; - - private $name; - private $mode; - private $default; - private $description; - - /** - * 构造方法 - * @param string $name 参数名 - * @param int $mode 参数类型: self::REQUIRED 或者 self::OPTIONAL - * @param string $description 描述 - * @param mixed $default 默认值 (仅 self::OPTIONAL 类型有效) - * @throws \InvalidArgumentException - */ - public function __construct($name, $mode = null, $description = '', $default = null) - { - if (null === $mode) { - $mode = self::OPTIONAL; - } elseif (!is_int($mode) || $mode > 7 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->mode = $mode; - $this->description = $description; - - $this->setDefault($default); - } - - /** - * 获取参数名 - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * 是否必须 - * @return bool - */ - public function isRequired() - { - return self::REQUIRED === (self::REQUIRED & $this->mode); - } - - /** - * 该参数是否接受数组 - * @return bool - */ - public function isArray() - { - return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); - } - - /** - * 设置默认值 - * @param mixed $default 默认值 - * @throws \LogicException - */ - public function setDefault($default = null) - { - if (self::REQUIRED === $this->mode && null !== $default) { - throw new \LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array argument must be an array.'); - } - } - - $this->default = $default; - } - - /** - * 获取默认值 - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * 获取描述 - * @return string - */ - public function getDescription() - { - return $this->description; - } -} diff --git a/thinkphp/library/think/console/input/Definition.php b/thinkphp/library/think/console/input/Definition.php deleted file mode 100755 index c71977e..0000000 --- a/thinkphp/library/think/console/input/Definition.php +++ /dev/null @@ -1,375 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\input; - -class Definition -{ - - /** - * @var Argument[] - */ - private $arguments; - - private $requiredCount; - private $hasAnArrayArgument = false; - private $hasOptional; - - /** - * @var Option[] - */ - private $options; - private $shortcuts; - - /** - * 构造方法 - * @param array $definition - * @api - */ - public function __construct(array $definition = []) - { - $this->setDefinition($definition); - } - - /** - * 设置指令的定义 - * @param array $definition 定义的数组 - */ - public function setDefinition(array $definition) - { - $arguments = []; - $options = []; - foreach ($definition as $item) { - if ($item instanceof Option) { - $options[] = $item; - } else { - $arguments[] = $item; - } - } - - $this->setArguments($arguments); - $this->setOptions($options); - } - - /** - * 设置参数 - * @param Argument[] $arguments 参数数组 - */ - public function setArguments($arguments = []) - { - $this->arguments = []; - $this->requiredCount = 0; - $this->hasOptional = false; - $this->hasAnArrayArgument = false; - $this->addArguments($arguments); - } - - /** - * 添加参数 - * @param Argument[] $arguments 参数数组 - * @api - */ - public function addArguments($arguments = []) - { - if (null !== $arguments) { - foreach ($arguments as $argument) { - $this->addArgument($argument); - } - } - } - - /** - * 添加一个参数 - * @param Argument $argument 参数 - * @throws \LogicException - */ - public function addArgument(Argument $argument) - { - if (isset($this->arguments[$argument->getName()])) { - throw new \LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); - } - - if ($this->hasAnArrayArgument) { - throw new \LogicException('Cannot add an argument after an array argument.'); - } - - if ($argument->isRequired() && $this->hasOptional) { - throw new \LogicException('Cannot add a required argument after an optional one.'); - } - - if ($argument->isArray()) { - $this->hasAnArrayArgument = true; - } - - if ($argument->isRequired()) { - ++$this->requiredCount; - } else { - $this->hasOptional = true; - } - - $this->arguments[$argument->getName()] = $argument; - } - - /** - * 根据名称或者位置获取参数 - * @param string|int $name 参数名或者位置 - * @return Argument 参数 - * @throws \InvalidArgumentException - */ - public function getArgument($name) - { - if (!$this->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return $arguments[$name]; - } - - /** - * 根据名称或位置检查是否具有某个参数 - * @param string|int $name 参数名或者位置 - * @return bool - * @api - */ - public function hasArgument($name) - { - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return isset($arguments[$name]); - } - - /** - * 获取所有的参数 - * @return Argument[] 参数数组 - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * 获取参数数量 - * @return int - */ - public function getArgumentCount() - { - return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments); - } - - /** - * 获取必填的参数的数量 - * @return int - */ - public function getArgumentRequiredCount() - { - return $this->requiredCount; - } - - /** - * 获取参数默认值 - * @return array - */ - public function getArgumentDefaults() - { - $values = []; - foreach ($this->arguments as $argument) { - $values[$argument->getName()] = $argument->getDefault(); - } - - return $values; - } - - /** - * 设置选项 - * @param Option[] $options 选项数组 - */ - public function setOptions($options = []) - { - $this->options = []; - $this->shortcuts = []; - $this->addOptions($options); - } - - /** - * 添加选项 - * @param Option[] $options 选项数组 - * @api - */ - public function addOptions($options = []) - { - foreach ($options as $option) { - $this->addOption($option); - } - } - - /** - * 添加一个选项 - * @param Option $option 选项 - * @throws \LogicException - * @api - */ - public function addOption(Option $option) - { - if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { - throw new \LogicException(sprintf('An option named "%s" already exists.', $option->getName())); - } - - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - if (isset($this->shortcuts[$shortcut]) - && !$option->equals($this->options[$this->shortcuts[$shortcut]]) - ) { - throw new \LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); - } - } - } - - $this->options[$option->getName()] = $option; - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - $this->shortcuts[$shortcut] = $option->getName(); - } - } - } - - /** - * 根据名称获取选项 - * @param string $name 选项名 - * @return Option - * @throws \InvalidArgumentException - * @api - */ - public function getOption($name) - { - if (!$this->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - return $this->options[$name]; - } - - /** - * 根据名称检查是否有这个选项 - * @param string $name 选项名 - * @return bool - * @api - */ - public function hasOption($name) - { - return isset($this->options[$name]); - } - - /** - * 获取所有选项 - * @return Option[] - * @api - */ - public function getOptions() - { - return $this->options; - } - - /** - * 根据名称检查某个选项是否有短名称 - * @param string $name 短名称 - * @return bool - */ - public function hasShortcut($name) - { - return isset($this->shortcuts[$name]); - } - - /** - * 根据短名称获取选项 - * @param string $shortcut 短名称 - * @return Option - */ - public function getOptionForShortcut($shortcut) - { - return $this->getOption($this->shortcutToName($shortcut)); - } - - /** - * 获取所有选项的默认值 - * @return array - */ - public function getOptionDefaults() - { - $values = []; - foreach ($this->options as $option) { - $values[$option->getName()] = $option->getDefault(); - } - - return $values; - } - - /** - * 根据短名称获取选项名 - * @param string $shortcut 短名称 - * @return string - * @throws \InvalidArgumentException - */ - private function shortcutToName($shortcut) - { - if (!isset($this->shortcuts[$shortcut])) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - return $this->shortcuts[$shortcut]; - } - - /** - * 获取该指令的介绍 - * @param bool $short 是否简洁介绍 - * @return string - */ - public function getSynopsis($short = false) - { - $elements = []; - - if ($short && $this->getOptions()) { - $elements[] = '[options]'; - } elseif (!$short) { - foreach ($this->getOptions() as $option) { - $value = ''; - if ($option->acceptValue()) { - $value = sprintf(' %s%s%s', $option->isValueOptional() ? '[' : '', strtoupper($option->getName()), $option->isValueOptional() ? ']' : ''); - } - - $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; - $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value); - } - } - - if (count($elements) && $this->getArguments()) { - $elements[] = '[--]'; - } - - foreach ($this->getArguments() as $argument) { - $element = '<' . $argument->getName() . '>'; - if (!$argument->isRequired()) { - $element = '[' . $element . ']'; - } elseif ($argument->isArray()) { - $element .= ' (' . $element . ')'; - } - - if ($argument->isArray()) { - $element .= '...'; - } - - $elements[] = $element; - } - - return implode(' ', $elements); - } -} diff --git a/thinkphp/library/think/console/input/Option.php b/thinkphp/library/think/console/input/Option.php deleted file mode 100755 index e5707c9..0000000 --- a/thinkphp/library/think/console/input/Option.php +++ /dev/null @@ -1,190 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\input; - -class Option -{ - - const VALUE_NONE = 1; - const VALUE_REQUIRED = 2; - const VALUE_OPTIONAL = 4; - const VALUE_IS_ARRAY = 8; - - private $name; - private $shortcut; - private $mode; - private $default; - private $description; - - /** - * 构造方法 - * @param string $name 选项名 - * @param string|array $shortcut 短名称,多个用|隔开或者使用数组 - * @param int $mode 选项类型(可选类型为 self::VALUE_*) - * @param string $description 描述 - * @param mixed $default 默认值 (类型为 self::VALUE_REQUIRED 或者 self::VALUE_NONE 的时候必须为null) - * @throws \InvalidArgumentException - */ - public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - if (0 === strpos($name, '--')) { - $name = substr($name, 2); - } - - if (empty($name)) { - throw new \InvalidArgumentException('An option name cannot be empty.'); - } - - if (empty($shortcut)) { - $shortcut = null; - } - - if (null !== $shortcut) { - if (is_array($shortcut)) { - $shortcut = implode('|', $shortcut); - } - $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-')); - $shortcuts = array_filter($shortcuts); - $shortcut = implode('|', $shortcuts); - - if (empty($shortcut)) { - throw new \InvalidArgumentException('An option shortcut cannot be empty.'); - } - } - - if (null === $mode) { - $mode = self::VALUE_NONE; - } elseif (!is_int($mode) || $mode > 15 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->shortcut = $shortcut; - $this->mode = $mode; - $this->description = $description; - - if ($this->isArray() && !$this->acceptValue()) { - throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); - } - - $this->setDefault($default); - } - - /** - * 获取短名称 - * @return string - */ - public function getShortcut() - { - return $this->shortcut; - } - - /** - * 获取选项名 - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * 是否可以设置值 - * @return bool 类型不是 self::VALUE_NONE 的时候返回true,其他均返回false - */ - public function acceptValue() - { - return $this->isValueRequired() || $this->isValueOptional(); - } - - /** - * 是否必须 - * @return bool 类型是 self::VALUE_REQUIRED 的时候返回true,其他均返回false - */ - public function isValueRequired() - { - return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); - } - - /** - * 是否可选 - * @return bool 类型是 self::VALUE_OPTIONAL 的时候返回true,其他均返回false - */ - public function isValueOptional() - { - return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); - } - - /** - * 选项值是否接受数组 - * @return bool 类型是 self::VALUE_IS_ARRAY 的时候返回true,其他均返回false - */ - public function isArray() - { - return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); - } - - /** - * 设置默认值 - * @param mixed $default 默认值 - * @throws \LogicException - */ - public function setDefault($default = null) - { - if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { - throw new \LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array option must be an array.'); - } - } - - $this->default = $this->acceptValue() ? $default : false; - } - - /** - * 获取默认值 - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * 获取描述文字 - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * 检查所给选项是否是当前这个 - * @param Option $option - * @return bool - */ - public function equals(Option $option) - { - return $option->getName() === $this->getName() - && $option->getShortcut() === $this->getShortcut() - && $option->getDefault() === $this->getDefault() - && $option->isArray() === $this->isArray() - && $option->isValueRequired() === $this->isValueRequired() - && $option->isValueOptional() === $this->isValueOptional(); - } -} diff --git a/thinkphp/library/think/console/output/Ask.php b/thinkphp/library/think/console/output/Ask.php deleted file mode 100755 index 4d360bc..0000000 --- a/thinkphp/library/think/console/output/Ask.php +++ /dev/null @@ -1,340 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output; - -use think\console\Input; -use think\console\Output; -use think\console\output\question\Choice; -use think\console\output\question\Confirmation; - -class Ask -{ - private static $stty; - - private static $shell; - - /** @var Input */ - protected $input; - - /** @var Output */ - protected $output; - - /** @var Question */ - protected $question; - - public function __construct(Input $input, Output $output, Question $question) - { - $this->input = $input; - $this->output = $output; - $this->question = $question; - } - - public function run() - { - if (!$this->input->isInteractive()) { - return $this->question->getDefault(); - } - - if (!$this->question->getValidator()) { - return $this->doAsk(); - } - - $that = $this; - - $interviewer = function () use ($that) { - return $that->doAsk(); - }; - - return $this->validateAttempts($interviewer); - } - - protected function doAsk() - { - $this->writePrompt(); - - $inputStream = STDIN; - $autocomplete = $this->question->getAutocompleterValues(); - - if (null === $autocomplete || !$this->hasSttyAvailable()) { - $ret = false; - if ($this->question->isHidden()) { - try { - $ret = trim($this->getHiddenResponse($inputStream)); - } catch (\RuntimeException $e) { - if (!$this->question->isHiddenFallback()) { - throw $e; - } - } - } - - if (false === $ret) { - $ret = fgets($inputStream, 4096); - if (false === $ret) { - throw new \RuntimeException('Aborted'); - } - $ret = trim($ret); - } - } else { - $ret = trim($this->autocomplete($inputStream)); - } - - $ret = strlen($ret) > 0 ? $ret : $this->question->getDefault(); - - if ($normalizer = $this->question->getNormalizer()) { - return $normalizer($ret); - } - - return $ret; - } - - private function autocomplete($inputStream) - { - $autocomplete = $this->question->getAutocompleterValues(); - $ret = ''; - - $i = 0; - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - - $sttyMode = shell_exec('stty -g'); - - shell_exec('stty -icanon -echo'); - - while (!feof($inputStream)) { - $c = fread($inputStream, 1); - - if ("\177" === $c) { - if (0 === $numMatches && 0 !== $i) { - --$i; - $this->output->write("\033[1D"); - } - - if ($i === 0) { - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - } else { - $numMatches = 0; - } - - $ret = substr($ret, 0, $i); - } elseif ("\033" === $c) { - $c .= fread($inputStream, 2); - - if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { - if ('A' === $c[2] && -1 === $ofs) { - $ofs = 0; - } - - if (0 === $numMatches) { - continue; - } - - $ofs += ('A' === $c[2]) ? -1 : 1; - $ofs = ($numMatches + $ofs) % $numMatches; - } - } elseif (ord($c) < 32) { - if ("\t" === $c || "\n" === $c) { - if ($numMatches > 0 && -1 !== $ofs) { - $ret = $matches[$ofs]; - $this->output->write(substr($ret, $i)); - $i = strlen($ret); - } - - if ("\n" === $c) { - $this->output->write($c); - break; - } - - $numMatches = 0; - } - - continue; - } else { - $this->output->write($c); - $ret .= $c; - ++$i; - - $numMatches = 0; - $ofs = 0; - - foreach ($autocomplete as $value) { - if (0 === strpos($value, $ret) && $i !== strlen($value)) { - $matches[$numMatches++] = $value; - } - } - } - - $this->output->write("\033[K"); - - if ($numMatches > 0 && -1 !== $ofs) { - $this->output->write("\0337"); - $this->output->highlight(substr($matches[$ofs], $i)); - $this->output->write("\0338"); - } - } - - shell_exec(sprintf('stty %s', $sttyMode)); - - return $ret; - } - - protected function getHiddenResponse($inputStream) - { - if ('\\' === DIRECTORY_SEPARATOR) { - $exe = __DIR__ . '/../bin/hiddeninput.exe'; - - $value = rtrim(shell_exec($exe)); - $this->output->writeln(''); - - if (isset($tmpExe)) { - unlink($tmpExe); - } - - return $value; - } - - if ($this->hasSttyAvailable()) { - $sttyMode = shell_exec('stty -g'); - - shell_exec('stty -echo'); - $value = fgets($inputStream, 4096); - shell_exec(sprintf('stty %s', $sttyMode)); - - if (false === $value) { - throw new \RuntimeException('Aborted'); - } - - $value = trim($value); - $this->output->writeln(''); - - return $value; - } - - if (false !== $shell = $this->getShell()) { - $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword'; - $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd); - $value = rtrim(shell_exec($command)); - $this->output->writeln(''); - - return $value; - } - - throw new \RuntimeException('Unable to hide the response.'); - } - - protected function validateAttempts($interviewer) - { - /** @var \Exception $error */ - $error = null; - $attempts = $this->question->getMaxAttempts(); - while (null === $attempts || $attempts--) { - if (null !== $error) { - $this->output->error($error->getMessage()); - } - - try { - return call_user_func($this->question->getValidator(), $interviewer()); - } catch (\Exception $error) { - } - } - - throw $error; - } - - /** - * 显示问题的提示信息 - */ - protected function writePrompt() - { - $text = $this->question->getQuestion(); - $default = $this->question->getDefault(); - - switch (true) { - case null === $default: - $text = sprintf(' <info>%s</info>:', $text); - - break; - - case $this->question instanceof Confirmation: - $text = sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no'); - - break; - - case $this->question instanceof Choice && $this->question->isMultiselect(): - $choices = $this->question->getChoices(); - $default = explode(',', $default); - - foreach ($default as $key => $value) { - $default[$key] = $choices[trim($value)]; - } - - $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, implode(', ', $default)); - - break; - - case $this->question instanceof Choice: - $choices = $this->question->getChoices(); - $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, $choices[$default]); - - break; - - default: - $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, $default); - } - - $this->output->writeln($text); - - if ($this->question instanceof Choice) { - $width = max(array_map('strlen', array_keys($this->question->getChoices()))); - - foreach ($this->question->getChoices() as $key => $value) { - $this->output->writeln(sprintf(" [<comment>%-${width}s</comment>] %s", $key, $value)); - } - } - - $this->output->write(' > '); - } - - private function getShell() - { - if (null !== self::$shell) { - return self::$shell; - } - - self::$shell = false; - - if (file_exists('/usr/bin/env')) { - $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null"; - foreach (['bash', 'zsh', 'ksh', 'csh'] as $sh) { - if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) { - self::$shell = $sh; - break; - } - } - } - - return self::$shell; - } - - private function hasSttyAvailable() - { - if (null !== self::$stty) { - return self::$stty; - } - - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = $exitcode === 0; - } -} \ No newline at end of file diff --git a/thinkphp/library/think/console/output/Descriptor.php b/thinkphp/library/think/console/output/Descriptor.php deleted file mode 100755 index 6d98d53..0000000 --- a/thinkphp/library/think/console/output/Descriptor.php +++ /dev/null @@ -1,319 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output; - -use think\Console; -use think\console\Command; -use think\console\input\Argument as InputArgument; -use think\console\input\Definition as InputDefinition; -use think\console\input\Option as InputOption; -use think\console\Output; -use think\console\output\descriptor\Console as ConsoleDescription; - -class Descriptor -{ - - /** - * @var Output - */ - protected $output; - - /** - * {@inheritdoc} - */ - public function describe(Output $output, $object, array $options = []) - { - $this->output = $output; - - switch (true) { - case $object instanceof InputArgument: - $this->describeInputArgument($object, $options); - break; - case $object instanceof InputOption: - $this->describeInputOption($object, $options); - break; - case $object instanceof InputDefinition: - $this->describeInputDefinition($object, $options); - break; - case $object instanceof Command: - $this->describeCommand($object, $options); - break; - case $object instanceof Console: - $this->describeConsole($object, $options); - break; - default: - throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object))); - } - } - - /** - * 输出内容 - * @param string $content - * @param bool $decorated - */ - protected function write($content, $decorated = false) - { - $this->output->write($content, false, $decorated ? Output::OUTPUT_NORMAL : Output::OUTPUT_RAW); - } - - /** - * 描述参数 - * @param InputArgument $argument - * @param array $options - * @return string|mixed - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - if (null !== $argument->getDefault() - && (!is_array($argument->getDefault()) - || count($argument->getDefault())) - ) { - $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($argument->getDefault())); - } else { - $default = ''; - } - - $totalWidth = isset($options['total_width']) ? $options['total_width'] : strlen($argument->getName()); - $spacingWidth = $totalWidth - strlen($argument->getName()) + 2; - - $this->writeText(sprintf(" <info>%s</info>%s%s%s", $argument->getName(), str_repeat(' ', $spacingWidth), // + 17 = 2 spaces + <info> + </info> + 2 spaces - preg_replace('/\s*\R\s*/', PHP_EOL . str_repeat(' ', $totalWidth + 17), $argument->getDescription()), $default), $options); - } - - /** - * 描述选项 - * @param InputOption $option - * @param array $options - * @return string|mixed - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - if ($option->acceptValue() && null !== $option->getDefault() - && (!is_array($option->getDefault()) - || count($option->getDefault())) - ) { - $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($option->getDefault())); - } else { - $default = ''; - } - - $value = ''; - if ($option->acceptValue()) { - $value = '=' . strtoupper($option->getName()); - - if ($option->isValueOptional()) { - $value = '[' . $value . ']'; - } - } - - $totalWidth = isset($options['total_width']) ? $options['total_width'] : $this->calculateTotalWidthForOptions([$option]); - $synopsis = sprintf('%s%s', $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : ' ', sprintf('--%s%s', $option->getName(), $value)); - - $spacingWidth = $totalWidth - strlen($synopsis) + 2; - - $this->writeText(sprintf(" <info>%s</info>%s%s%s%s", $synopsis, str_repeat(' ', $spacingWidth), // + 17 = 2 spaces + <info> + </info> + 2 spaces - preg_replace('/\s*\R\s*/', "\n" . str_repeat(' ', $totalWidth + 17), $option->getDescription()), $default, $option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''), $options); - } - - /** - * 描述输入 - * @param InputDefinition $definition - * @param array $options - * @return string|mixed - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); - foreach ($definition->getArguments() as $argument) { - $totalWidth = max($totalWidth, strlen($argument->getName())); - } - - if ($definition->getArguments()) { - $this->writeText('<comment>Arguments:</comment>', $options); - $this->writeText("\n"); - foreach ($definition->getArguments() as $argument) { - $this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth])); - $this->writeText("\n"); - } - } - - if ($definition->getArguments() && $definition->getOptions()) { - $this->writeText("\n"); - } - - if ($definition->getOptions()) { - $laterOptions = []; - - $this->writeText('<comment>Options:</comment>', $options); - foreach ($definition->getOptions() as $option) { - if (strlen($option->getShortcut()) > 1) { - $laterOptions[] = $option; - continue; - } - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - foreach ($laterOptions as $option) { - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - } - } - - /** - * 描述指令 - * @param Command $command - * @param array $options - * @return string|mixed - */ - protected function describeCommand(Command $command, array $options = []) - { - $command->getSynopsis(true); - $command->getSynopsis(false); - $command->mergeConsoleDefinition(false); - - $this->writeText('<comment>Usage:</comment>', $options); - foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) { - $this->writeText("\n"); - $this->writeText(' ' . $usage, $options); - } - $this->writeText("\n"); - - $definition = $command->getNativeDefinition(); - if ($definition->getOptions() || $definition->getArguments()) { - $this->writeText("\n"); - $this->describeInputDefinition($definition, $options); - $this->writeText("\n"); - } - - if ($help = $command->getProcessedHelp()) { - $this->writeText("\n"); - $this->writeText('<comment>Help:</comment>', $options); - $this->writeText("\n"); - $this->writeText(' ' . str_replace("\n", "\n ", $help), $options); - $this->writeText("\n"); - } - } - - /** - * 描述控制台 - * @param Console $console - * @param array $options - * @return string|mixed - */ - protected function describeConsole(Console $console, array $options = []) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ConsoleDescription($console, $describedNamespace); - - if (isset($options['raw_text']) && $options['raw_text']) { - $width = $this->getColumnWidth($description->getCommands()); - - foreach ($description->getCommands() as $command) { - $this->writeText(sprintf("%-${width}s %s", $command->getName(), $command->getDescription()), $options); - $this->writeText("\n"); - } - } else { - if ('' != $help = $console->getHelp()) { - $this->writeText("$help\n\n", $options); - } - - $this->writeText("<comment>Usage:</comment>\n", $options); - $this->writeText(" command [options] [arguments]\n\n", $options); - - $this->describeInputDefinition(new InputDefinition($console->getDefinition()->getOptions()), $options); - - $this->writeText("\n"); - $this->writeText("\n"); - - $width = $this->getColumnWidth($description->getCommands()); - - if ($describedNamespace) { - $this->writeText(sprintf('<comment>Available commands for the "%s" namespace:</comment>', $describedNamespace), $options); - } else { - $this->writeText('<comment>Available commands:</comment>', $options); - } - - // add commands by namespace - foreach ($description->getNamespaces() as $namespace) { - if (!$describedNamespace && ConsoleDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->writeText("\n"); - $this->writeText(' <comment>' . $namespace['id'] . '</comment>', $options); - } - - foreach ($namespace['commands'] as $name) { - $this->writeText("\n"); - $spacingWidth = $width - strlen($name); - $this->writeText(sprintf(" <info>%s</info>%s%s", $name, str_repeat(' ', $spacingWidth), $description->getCommand($name) - ->getDescription()), $options); - } - } - - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - private function writeText($content, array $options = []) - { - $this->write(isset($options['raw_text']) - && $options['raw_text'] ? strip_tags($content) : $content, isset($options['raw_output']) ? !$options['raw_output'] : true); - } - - /** - * 格式化 - * @param mixed $default - * @return string - */ - private function formatDefaultValue($default) - { - return json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - /** - * @param Command[] $commands - * @return int - */ - private function getColumnWidth(array $commands) - { - $width = 0; - foreach ($commands as $command) { - $width = strlen($command->getName()) > $width ? strlen($command->getName()) : $width; - } - - return $width + 2; - } - - /** - * @param InputOption[] $options - * @return int - */ - private function calculateTotalWidthForOptions($options) - { - $totalWidth = 0; - foreach ($options as $option) { - $nameLength = 4 + strlen($option->getName()) + 2; // - + shortcut + , + whitespace + name + -- - - if ($option->acceptValue()) { - $valueLength = 1 + strlen($option->getName()); // = + value - $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ] - - $nameLength += $valueLength; - } - $totalWidth = max($totalWidth, $nameLength); - } - - return $totalWidth; - } -} diff --git a/thinkphp/library/think/console/output/Formatter.php b/thinkphp/library/think/console/output/Formatter.php deleted file mode 100755 index f8bee55..0000000 --- a/thinkphp/library/think/console/output/Formatter.php +++ /dev/null @@ -1,198 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- -namespace think\console\output; - -use think\console\output\formatter\Stack as StyleStack; -use think\console\output\formatter\Style; - -class Formatter -{ - - private $decorated = false; - private $styles = []; - private $styleStack; - - /** - * 转义 - * @param string $text - * @return string - */ - public static function escape($text) - { - return preg_replace('/([^\\\\]?)</is', '$1\\<', $text); - } - - /** - * 初始化命令行输出格式 - */ - public function __construct() - { - $this->setStyle('error', new Style('white', 'red')); - $this->setStyle('info', new Style('green')); - $this->setStyle('comment', new Style('yellow')); - $this->setStyle('question', new Style('black', 'cyan')); - $this->setStyle('highlight', new Style('red')); - $this->setStyle('warning', new Style('black', 'yellow')); - - $this->styleStack = new StyleStack(); - } - - /** - * 设置外观标识 - * @param bool $decorated 是否美化文字 - */ - public function setDecorated($decorated) - { - $this->decorated = (bool) $decorated; - } - - /** - * 获取外观标识 - * @return bool - */ - public function isDecorated() - { - return $this->decorated; - } - - /** - * 添加一个新样式 - * @param string $name 样式名 - * @param Style $style 样式实例 - */ - public function setStyle($name, Style $style) - { - $this->styles[strtolower($name)] = $style; - } - - /** - * 是否有这个样式 - * @param string $name - * @return bool - */ - public function hasStyle($name) - { - return isset($this->styles[strtolower($name)]); - } - - /** - * 获取样式 - * @param string $name - * @return Style - * @throws \InvalidArgumentException - */ - public function getStyle($name) - { - if (!$this->hasStyle($name)) { - throw new \InvalidArgumentException(sprintf('Undefined style: %s', $name)); - } - - return $this->styles[strtolower($name)]; - } - - /** - * 使用所给的样式格式化文字 - * @param string $message 文字 - * @return string - */ - public function format($message) - { - $offset = 0; - $output = ''; - $tagRegex = '[a-z][a-z0-9_=;-]*'; - preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#isx", $message, $matches, PREG_OFFSET_CAPTURE); - foreach ($matches[0] as $i => $match) { - $pos = $match[1]; - $text = $match[0]; - - if (0 != $pos && '\\' == $message[$pos - 1]) { - continue; - } - - $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset)); - $offset = $pos + strlen($text); - - if ($open = '/' != $text[1]) { - $tag = $matches[1][$i][0]; - } else { - $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : ''; - } - - if (!$open && !$tag) { - // </> - $this->styleStack->pop(); - } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) { - $output .= $this->applyCurrentStyle($text); - } elseif ($open) { - $this->styleStack->push($style); - } else { - $this->styleStack->pop($style); - } - } - - $output .= $this->applyCurrentStyle(substr($message, $offset)); - - return str_replace('\\<', '<', $output); - } - - /** - * @return StyleStack - */ - public function getStyleStack() - { - return $this->styleStack; - } - - /** - * 根据字符串创建新的样式实例 - * @param string $string - * @return Style|bool - */ - private function createStyleFromString($string) - { - if (isset($this->styles[$string])) { - return $this->styles[$string]; - } - - if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) { - return false; - } - - $style = new Style(); - foreach ($matches as $match) { - array_shift($match); - - if ('fg' == $match[0]) { - $style->setForeground($match[1]); - } elseif ('bg' == $match[0]) { - $style->setBackground($match[1]); - } else { - try { - $style->setOption($match[1]); - } catch (\InvalidArgumentException $e) { - return false; - } - } - } - - return $style; - } - - /** - * 从堆栈应用样式到文字 - * @param string $text 文字 - * @return string - */ - private function applyCurrentStyle($text) - { - return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text; - } -} diff --git a/thinkphp/library/think/console/output/Question.php b/thinkphp/library/think/console/output/Question.php deleted file mode 100755 index 03975f2..0000000 --- a/thinkphp/library/think/console/output/Question.php +++ /dev/null @@ -1,211 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output; - -class Question -{ - - private $question; - private $attempts; - private $hidden = false; - private $hiddenFallback = true; - private $autocompleterValues; - private $validator; - private $default; - private $normalizer; - - /** - * 构造方法 - * @param string $question 问题 - * @param mixed $default 默认答案 - */ - public function __construct($question, $default = null) - { - $this->question = $question; - $this->default = $default; - } - - /** - * 获取问题 - * @return string - */ - public function getQuestion() - { - return $this->question; - } - - /** - * 获取默认答案 - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * 是否隐藏答案 - * @return bool - */ - public function isHidden() - { - return $this->hidden; - } - - /** - * 隐藏答案 - * @param bool $hidden - * @return Question - */ - public function setHidden($hidden) - { - if ($this->autocompleterValues) { - throw new \LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->hidden = (bool) $hidden; - - return $this; - } - - /** - * 不能被隐藏是否撤销 - * @return bool - */ - public function isHiddenFallback() - { - return $this->hiddenFallback; - } - - /** - * 设置不能被隐藏的时候的操作 - * @param bool $fallback - * @return Question - */ - public function setHiddenFallback($fallback) - { - $this->hiddenFallback = (bool) $fallback; - - return $this; - } - - /** - * 获取自动完成 - * @return null|array|\Traversable - */ - public function getAutocompleterValues() - { - return $this->autocompleterValues; - } - - /** - * 设置自动完成的值 - * @param null|array|\Traversable $values - * @return Question - * @throws \InvalidArgumentException - * @throws \LogicException - */ - public function setAutocompleterValues($values) - { - if (is_array($values) && $this->isAssoc($values)) { - $values = array_merge(array_keys($values), array_values($values)); - } - - if (null !== $values && !is_array($values)) { - if (!$values instanceof \Traversable || $values instanceof \Countable) { - throw new \InvalidArgumentException('Autocompleter values can be either an array, `null` or an object implementing both `Countable` and `Traversable` interfaces.'); - } - } - - if ($this->hidden) { - throw new \LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->autocompleterValues = $values; - - return $this; - } - - /** - * 设置答案的验证器 - * @param null|callable $validator - * @return Question The current instance - */ - public function setValidator($validator) - { - $this->validator = $validator; - - return $this; - } - - /** - * 获取验证器 - * @return null|callable - */ - public function getValidator() - { - return $this->validator; - } - - /** - * 设置最大重试次数 - * @param null|int $attempts - * @return Question - * @throws \InvalidArgumentException - */ - public function setMaxAttempts($attempts) - { - if (null !== $attempts && $attempts < 1) { - throw new \InvalidArgumentException('Maximum number of attempts must be a positive value.'); - } - - $this->attempts = $attempts; - - return $this; - } - - /** - * 获取最大重试次数 - * @return null|int - */ - public function getMaxAttempts() - { - return $this->attempts; - } - - /** - * 设置响应的回调 - * @param string|\Closure $normalizer - * @return Question - */ - public function setNormalizer($normalizer) - { - $this->normalizer = $normalizer; - - return $this; - } - - /** - * 获取响应回调 - * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. - * @return string|\Closure - */ - public function getNormalizer() - { - return $this->normalizer; - } - - protected function isAssoc($array) - { - return (bool) count(array_filter(array_keys($array), 'is_string')); - } -} diff --git a/thinkphp/library/think/console/output/descriptor/Console.php b/thinkphp/library/think/console/output/descriptor/Console.php deleted file mode 100755 index 4648b68..0000000 --- a/thinkphp/library/think/console/output/descriptor/Console.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\descriptor; - -use think\Console as ThinkConsole; -use think\console\Command; - -class Console -{ - - const GLOBAL_NAMESPACE = '_global'; - - /** - * @var ThinkConsole - */ - private $console; - - /** - * @var null|string - */ - private $namespace; - - /** - * @var array - */ - private $namespaces; - - /** - * @var Command[] - */ - private $commands; - - /** - * @var Command[] - */ - private $aliases; - - /** - * 构造方法 - * @param ThinkConsole $console - * @param string|null $namespace - */ - public function __construct(ThinkConsole $console, $namespace = null) - { - $this->console = $console; - $this->namespace = $namespace; - } - - /** - * @return array - */ - public function getNamespaces() - { - if (null === $this->namespaces) { - $this->inspectConsole(); - } - - return $this->namespaces; - } - - /** - * @return Command[] - */ - public function getCommands() - { - if (null === $this->commands) { - $this->inspectConsole(); - } - - return $this->commands; - } - - /** - * @param string $name - * @return Command - * @throws \InvalidArgumentException - */ - public function getCommand($name) - { - if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { - throw new \InvalidArgumentException(sprintf('Command %s does not exist.', $name)); - } - - return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name]; - } - - private function inspectConsole() - { - $this->commands = []; - $this->namespaces = []; - - $all = $this->console->all($this->namespace ? $this->console->findNamespace($this->namespace) : null); - foreach ($this->sortCommands($all) as $namespace => $commands) { - $names = []; - - /** @var Command $command */ - foreach ($commands as $name => $command) { - if (!$command->getName()) { - continue; - } - - if ($command->getName() === $name) { - $this->commands[$name] = $command; - } else { - $this->aliases[$name] = $command; - } - - $names[] = $name; - } - - $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names]; - } - } - - /** - * @param array $commands - * @return array - */ - private function sortCommands(array $commands) - { - $namespacedCommands = []; - foreach ($commands as $name => $command) { - $key = $this->console->extractNamespace($name, 1); - if (!$key) { - $key = self::GLOBAL_NAMESPACE; - } - - $namespacedCommands[$key][$name] = $command; - } - ksort($namespacedCommands); - - foreach ($namespacedCommands as &$commandsSet) { - ksort($commandsSet); - } - // unset reference to keep scope clear - unset($commandsSet); - - return $namespacedCommands; - } -} diff --git a/thinkphp/library/think/console/output/driver/Buffer.php b/thinkphp/library/think/console/output/driver/Buffer.php deleted file mode 100755 index c77a2ec..0000000 --- a/thinkphp/library/think/console/output/driver/Buffer.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\driver; - -use think\console\Output; - -class Buffer -{ - /** - * @var string - */ - private $buffer = ''; - - public function __construct(Output $output) - { - // do nothing - } - - public function fetch() - { - $content = $this->buffer; - $this->buffer = ''; - return $content; - } - - public function write($messages, $newline = false, $options = Output::OUTPUT_NORMAL) - { - $messages = (array) $messages; - - foreach ($messages as $message) { - $this->buffer .= $message; - } - if ($newline) { - $this->buffer .= "\n"; - } - } - - public function renderException(\Exception $e) - { - // do nothing - } - -} diff --git a/thinkphp/library/think/console/output/driver/Console.php b/thinkphp/library/think/console/output/driver/Console.php deleted file mode 100755 index af4341b..0000000 --- a/thinkphp/library/think/console/output/driver/Console.php +++ /dev/null @@ -1,368 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\driver; - -use think\console\Output; -use think\console\output\Formatter; - -class Console -{ - - /** @var Resource */ - private $stdout; - - /** @var Formatter */ - private $formatter; - - private $terminalDimensions; - - /** @var Output */ - private $output; - - public function __construct(Output $output) - { - $this->output = $output; - $this->formatter = new Formatter(); - $this->stdout = $this->openOutputStream(); - $decorated = $this->hasColorSupport($this->stdout); - $this->formatter->setDecorated($decorated); - } - - public function setDecorated($decorated) - { - $this->formatter->setDecorated($decorated); - } - - public function write($messages, $newline = false, $type = Output::OUTPUT_NORMAL, $stream = null) - { - if (Output::VERBOSITY_QUIET === $this->output->getVerbosity()) { - return; - } - - $messages = (array) $messages; - - foreach ($messages as $message) { - switch ($type) { - case Output::OUTPUT_NORMAL: - $message = $this->formatter->format($message); - break; - case Output::OUTPUT_RAW: - break; - case Output::OUTPUT_PLAIN: - $message = strip_tags($this->formatter->format($message)); - break; - default: - throw new \InvalidArgumentException(sprintf('Unknown output type given (%s)', $type)); - } - - $this->doWrite($message, $newline, $stream); - } - } - - public function renderException(\Exception $e) - { - $stderr = $this->openErrorStream(); - $decorated = $this->hasColorSupport($stderr); - $this->formatter->setDecorated($decorated); - - do { - $title = sprintf(' [%s] ', get_class($e)); - - $len = $this->stringWidth($title); - - $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX; - - if (defined('HHVM_VERSION') && $width > 1 << 31) { - $width = 1 << 31; - } - $lines = []; - foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) { - foreach ($this->splitStringByWidth($line, $width - 4) as $line) { - - $lineLength = $this->stringWidth(preg_replace('/\[[^m]*m/', '', $line)) + 4; - $lines[] = [$line, $lineLength]; - - $len = max($lineLength, $len); - } - } - - $messages = ['', '']; - $messages[] = $emptyLine = sprintf('<error>%s</error>', str_repeat(' ', $len)); - $messages[] = sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - $this->stringWidth($title)))); - foreach ($lines as $line) { - $messages[] = sprintf('<error> %s %s</error>', $line[0], str_repeat(' ', $len - $line[1])); - } - $messages[] = $emptyLine; - $messages[] = ''; - $messages[] = ''; - - $this->write($messages, true, Output::OUTPUT_NORMAL, $stderr); - - if (Output::VERBOSITY_VERBOSE <= $this->output->getVerbosity()) { - $this->write('<comment>Exception trace:</comment>', true, Output::OUTPUT_NORMAL, $stderr); - - // exception related properties - $trace = $e->getTrace(); - array_unshift($trace, [ - 'function' => '', - 'file' => $e->getFile() !== null ? $e->getFile() : 'n/a', - 'line' => $e->getLine() !== null ? $e->getLine() : 'n/a', - 'args' => [], - ]); - - for ($i = 0, $count = count($trace); $i < $count; ++$i) { - $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; - $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; - $function = $trace[$i]['function']; - $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a'; - $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; - - $this->write(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line), true, Output::OUTPUT_NORMAL, $stderr); - } - - $this->write('', true, Output::OUTPUT_NORMAL, $stderr); - $this->write('', true, Output::OUTPUT_NORMAL, $stderr); - } - } while ($e = $e->getPrevious()); - - } - - /** - * 获取终端宽度 - * @return int|null - */ - protected function getTerminalWidth() - { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[0]; - } - - /** - * 获取终端高度 - * @return int|null - */ - protected function getTerminalHeight() - { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[1]; - } - - /** - * 获取当前终端的尺寸 - * @return array - */ - public function getTerminalDimensions() - { - if ($this->terminalDimensions) { - return $this->terminalDimensions; - } - - if ('\\' === DS) { - if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) { - return [(int) $matches[1], (int) $matches[2]]; - } - if (preg_match('/^(\d+)x(\d+)$/', $this->getMode(), $matches)) { - return [(int) $matches[1], (int) $matches[2]]; - } - } - - if ($sttyString = $this->getSttyColumns()) { - if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { - return [(int) $matches[2], (int) $matches[1]]; - } - if (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { - return [(int) $matches[2], (int) $matches[1]]; - } - } - - return [null, null]; - } - - /** - * 获取stty列数 - * @return string - */ - private function getSttyColumns() - { - if (!function_exists('proc_open')) { - return null; - } - - $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; - $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - return $info; - } - return null; - } - - /** - * 获取终端模式 - * @return string <width>x<height> 或 null - */ - private function getMode() - { - if (!function_exists('proc_open')) { - return null; - } - - $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; - $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { - return $matches[2] . 'x' . $matches[1]; - } - } - return null; - } - - private function stringWidth($string) - { - if (!function_exists('mb_strwidth')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strwidth($string, $encoding); - } - - private function splitStringByWidth($string, $width) - { - if (!function_exists('mb_strwidth')) { - return str_split($string, $width); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return str_split($string, $width); - } - - $utf8String = mb_convert_encoding($string, 'utf8', $encoding); - $lines = []; - $line = ''; - foreach (preg_split('//u', $utf8String) as $char) { - if (mb_strwidth($line . $char, 'utf8') <= $width) { - $line .= $char; - continue; - } - $lines[] = str_pad($line, $width); - $line = $char; - } - if (strlen($line)) { - $lines[] = count($lines) ? str_pad($line, $width) : $line; - } - - mb_convert_variables($encoding, 'utf8', $lines); - - return $lines; - } - - private function isRunningOS400() - { - $checks = [ - function_exists('php_uname') ? php_uname('s') : '', - getenv('OSTYPE'), - PHP_OS, - ]; - return false !== stripos(implode(';', $checks), 'OS400'); - } - - /** - * 当前环境是否支持写入控制台输出到stdout. - * - * @return bool - */ - protected function hasStdoutSupport() - { - return false === $this->isRunningOS400(); - } - - /** - * 当前环境是否支持写入控制台输出到stderr. - * - * @return bool - */ - protected function hasStderrSupport() - { - return false === $this->isRunningOS400(); - } - - /** - * @return resource - */ - private function openOutputStream() - { - if (!$this->hasStdoutSupport()) { - return fopen('php://output', 'w'); - } - return @fopen('php://stdout', 'w') ?: fopen('php://output', 'w'); - } - - /** - * @return resource - */ - private function openErrorStream() - { - return fopen($this->hasStderrSupport() ? 'php://stderr' : 'php://output', 'w'); - } - - /** - * 将消息写入到输出。 - * @param string $message 消息 - * @param bool $newline 是否另起一行 - * @param null $stream - */ - protected function doWrite($message, $newline, $stream = null) - { - if (null === $stream) { - $stream = $this->stdout; - } - if (false === @fwrite($stream, $message . ($newline ? PHP_EOL : ''))) { - throw new \RuntimeException('Unable to write output.'); - } - - fflush($stream); - } - - /** - * 是否支持着色 - * @param $stream - * @return bool - */ - protected function hasColorSupport($stream) - { - if (DIRECTORY_SEPARATOR === '\\') { - return - '10.0.10586' === PHP_WINDOWS_VERSION_MAJOR . '.' . PHP_WINDOWS_VERSION_MINOR . '.' . PHP_WINDOWS_VERSION_BUILD - || false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM'); - } - - return function_exists('posix_isatty') && @posix_isatty($stream); - } - -} diff --git a/thinkphp/library/think/console/output/driver/Nothing.php b/thinkphp/library/think/console/output/driver/Nothing.php deleted file mode 100755 index 9a55f77..0000000 --- a/thinkphp/library/think/console/output/driver/Nothing.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\driver; - -use think\console\Output; - -class Nothing -{ - - public function __construct(Output $output) - { - // do nothing - } - - public function write($messages, $newline = false, $options = Output::OUTPUT_NORMAL) - { - // do nothing - } - - public function renderException(\Exception $e) - { - // do nothing - } -} diff --git a/thinkphp/library/think/console/output/formatter/Stack.php b/thinkphp/library/think/console/output/formatter/Stack.php deleted file mode 100755 index 4864a3f..0000000 --- a/thinkphp/library/think/console/output/formatter/Stack.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\formatter; - -class Stack -{ - - /** - * @var Style[] - */ - private $styles; - - /** - * @var Style - */ - private $emptyStyle; - - /** - * 构造方法 - * @param Style|null $emptyStyle - */ - public function __construct(Style $emptyStyle = null) - { - $this->emptyStyle = $emptyStyle ?: new Style(); - $this->reset(); - } - - /** - * 重置堆栈 - */ - public function reset() - { - $this->styles = []; - } - - /** - * 推一个样式进入堆栈 - * @param Style $style - */ - public function push(Style $style) - { - $this->styles[] = $style; - } - - /** - * 从堆栈中弹出一个样式 - * @param Style|null $style - * @return Style - * @throws \InvalidArgumentException - */ - public function pop(Style $style = null) - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - if (null === $style) { - return array_pop($this->styles); - } - - /** - * @var int $index - * @var Style $stackedStyle - */ - foreach (array_reverse($this->styles, true) as $index => $stackedStyle) { - if ($style->apply('') === $stackedStyle->apply('')) { - $this->styles = array_slice($this->styles, 0, $index); - - return $stackedStyle; - } - } - - throw new \InvalidArgumentException('Incorrectly nested style tag found.'); - } - - /** - * 计算堆栈的当前样式。 - * @return Style - */ - public function getCurrent() - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - return $this->styles[count($this->styles) - 1]; - } - - /** - * @param Style $emptyStyle - * @return Stack - */ - public function setEmptyStyle(Style $emptyStyle) - { - $this->emptyStyle = $emptyStyle; - - return $this; - } - - /** - * @return Style - */ - public function getEmptyStyle() - { - return $this->emptyStyle; - } -} diff --git a/thinkphp/library/think/console/output/formatter/Style.php b/thinkphp/library/think/console/output/formatter/Style.php deleted file mode 100755 index d9b0999..0000000 --- a/thinkphp/library/think/console/output/formatter/Style.php +++ /dev/null @@ -1,189 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\formatter; - -class Style -{ - - private static $availableForegroundColors = [ - 'black' => ['set' => 30, 'unset' => 39], - 'red' => ['set' => 31, 'unset' => 39], - 'green' => ['set' => 32, 'unset' => 39], - 'yellow' => ['set' => 33, 'unset' => 39], - 'blue' => ['set' => 34, 'unset' => 39], - 'magenta' => ['set' => 35, 'unset' => 39], - 'cyan' => ['set' => 36, 'unset' => 39], - 'white' => ['set' => 37, 'unset' => 39], - ]; - private static $availableBackgroundColors = [ - 'black' => ['set' => 40, 'unset' => 49], - 'red' => ['set' => 41, 'unset' => 49], - 'green' => ['set' => 42, 'unset' => 49], - 'yellow' => ['set' => 43, 'unset' => 49], - 'blue' => ['set' => 44, 'unset' => 49], - 'magenta' => ['set' => 45, 'unset' => 49], - 'cyan' => ['set' => 46, 'unset' => 49], - 'white' => ['set' => 47, 'unset' => 49], - ]; - private static $availableOptions = [ - 'bold' => ['set' => 1, 'unset' => 22], - 'underscore' => ['set' => 4, 'unset' => 24], - 'blink' => ['set' => 5, 'unset' => 25], - 'reverse' => ['set' => 7, 'unset' => 27], - 'conceal' => ['set' => 8, 'unset' => 28], - ]; - - private $foreground; - private $background; - private $options = []; - - /** - * 初始化输出的样式 - * @param string|null $foreground 字体颜色 - * @param string|null $background 背景色 - * @param array $options 格式 - * @api - */ - public function __construct($foreground = null, $background = null, array $options = []) - { - if (null !== $foreground) { - $this->setForeground($foreground); - } - if (null !== $background) { - $this->setBackground($background); - } - if (count($options)) { - $this->setOptions($options); - } - } - - /** - * 设置字体颜色 - * @param string|null $color 颜色名 - * @throws \InvalidArgumentException - * @api - */ - public function setForeground($color = null) - { - if (null === $color) { - $this->foreground = null; - - return; - } - - if (!isset(static::$availableForegroundColors[$color])) { - throw new \InvalidArgumentException(sprintf('Invalid foreground color specified: "%s". Expected one of (%s)', $color, implode(', ', array_keys(static::$availableForegroundColors)))); - } - - $this->foreground = static::$availableForegroundColors[$color]; - } - - /** - * 设置背景色 - * @param string|null $color 颜色名 - * @throws \InvalidArgumentException - * @api - */ - public function setBackground($color = null) - { - if (null === $color) { - $this->background = null; - - return; - } - - if (!isset(static::$availableBackgroundColors[$color])) { - throw new \InvalidArgumentException(sprintf('Invalid background color specified: "%s". Expected one of (%s)', $color, implode(', ', array_keys(static::$availableBackgroundColors)))); - } - - $this->background = static::$availableBackgroundColors[$color]; - } - - /** - * 设置字体格式 - * @param string $option 格式名 - * @throws \InvalidArgumentException When the option name isn't defined - * @api - */ - public function setOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, implode(', ', array_keys(static::$availableOptions)))); - } - - if (!in_array(static::$availableOptions[$option], $this->options)) { - $this->options[] = static::$availableOptions[$option]; - } - } - - /** - * 重置字体格式 - * @param string $option 格式名 - * @throws \InvalidArgumentException - */ - public function unsetOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, implode(', ', array_keys(static::$availableOptions)))); - } - - $pos = array_search(static::$availableOptions[$option], $this->options); - if (false !== $pos) { - unset($this->options[$pos]); - } - } - - /** - * 批量设置字体格式 - * @param array $options - */ - public function setOptions(array $options) - { - $this->options = []; - - foreach ($options as $option) { - $this->setOption($option); - } - } - - /** - * 应用样式到文字 - * @param string $text 文字 - * @return string - */ - public function apply($text) - { - $setCodes = []; - $unsetCodes = []; - - if (null !== $this->foreground) { - $setCodes[] = $this->foreground['set']; - $unsetCodes[] = $this->foreground['unset']; - } - if (null !== $this->background) { - $setCodes[] = $this->background['set']; - $unsetCodes[] = $this->background['unset']; - } - if (count($this->options)) { - foreach ($this->options as $option) { - $setCodes[] = $option['set']; - $unsetCodes[] = $option['unset']; - } - } - - if (0 === count($setCodes)) { - return $text; - } - - return sprintf("\033[%sm%s\033[%sm", implode(';', $setCodes), $text, implode(';', $unsetCodes)); - } -} diff --git a/thinkphp/library/think/console/output/question/Choice.php b/thinkphp/library/think/console/output/question/Choice.php deleted file mode 100755 index f6760e5..0000000 --- a/thinkphp/library/think/console/output/question/Choice.php +++ /dev/null @@ -1,163 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\question; - -use think\console\output\Question; - -class Choice extends Question -{ - - private $choices; - private $multiselect = false; - private $prompt = ' > '; - private $errorMessage = 'Value "%s" is invalid'; - - /** - * 构造方法 - * @param string $question 问题 - * @param array $choices 选项 - * @param mixed $default 默认答案 - */ - public function __construct($question, array $choices, $default = null) - { - parent::__construct($question, $default); - - $this->choices = $choices; - $this->setValidator($this->getDefaultValidator()); - $this->setAutocompleterValues($choices); - } - - /** - * 可选项 - * @return array - */ - public function getChoices() - { - return $this->choices; - } - - /** - * 设置可否多选 - * @param bool $multiselect - * @return self - */ - public function setMultiselect($multiselect) - { - $this->multiselect = $multiselect; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - public function isMultiselect() - { - return $this->multiselect; - } - - /** - * 获取提示 - * @return string - */ - public function getPrompt() - { - return $this->prompt; - } - - /** - * 设置提示 - * @param string $prompt - * @return self - */ - public function setPrompt($prompt) - { - $this->prompt = $prompt; - - return $this; - } - - /** - * 设置错误提示信息 - * @param string $errorMessage - * @return self - */ - public function setErrorMessage($errorMessage) - { - $this->errorMessage = $errorMessage; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - /** - * 获取默认的验证方法 - * @return callable - */ - private function getDefaultValidator() - { - $choices = $this->choices; - $errorMessage = $this->errorMessage; - $multiselect = $this->multiselect; - $isAssoc = $this->isAssoc($choices); - - return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) { - // Collapse all spaces. - $selectedChoices = str_replace(' ', '', $selected); - - if ($multiselect) { - // Check for a separated comma values - if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) { - throw new \InvalidArgumentException(sprintf($errorMessage, $selected)); - } - $selectedChoices = explode(',', $selectedChoices); - } else { - $selectedChoices = [$selected]; - } - - $multiselectChoices = []; - foreach ($selectedChoices as $value) { - $results = []; - foreach ($choices as $key => $choice) { - if ($choice === $value) { - $results[] = $key; - } - } - - if (count($results) > 1) { - throw new \InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of %s.', implode(' or ', $results))); - } - - $result = array_search($value, $choices); - - if (!$isAssoc) { - if (!empty($result)) { - $result = $choices[$result]; - } elseif (isset($choices[$value])) { - $result = $choices[$value]; - } - } elseif (empty($result) && array_key_exists($value, $choices)) { - $result = $value; - } - - if (empty($result)) { - throw new \InvalidArgumentException(sprintf($errorMessage, $value)); - } - array_push($multiselectChoices, $result); - } - - if ($multiselect) { - return $multiselectChoices; - } - - return current($multiselectChoices); - }; - } -} diff --git a/thinkphp/library/think/console/output/question/Confirmation.php b/thinkphp/library/think/console/output/question/Confirmation.php deleted file mode 100755 index 6598f9b..0000000 --- a/thinkphp/library/think/console/output/question/Confirmation.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\console\output\question; - -use think\console\output\Question; - -class Confirmation extends Question -{ - - private $trueAnswerRegex; - - /** - * 构造方法 - * @param string $question 问题 - * @param bool $default 默认答案 - * @param string $trueAnswerRegex 验证正则 - */ - public function __construct($question, $default = true, $trueAnswerRegex = '/^y/i') - { - parent::__construct($question, (bool) $default); - - $this->trueAnswerRegex = $trueAnswerRegex; - $this->setNormalizer($this->getDefaultNormalizer()); - } - - /** - * 获取默认的答案回调 - * @return callable - */ - private function getDefaultNormalizer() - { - $default = $this->getDefault(); - $regex = $this->trueAnswerRegex; - - return function ($answer) use ($default, $regex) { - if (is_bool($answer)) { - return $answer; - } - - $answerIsTrue = (bool) preg_match($regex, $answer); - if (false === $default) { - return $answer && $answerIsTrue; - } - - return !$answer || $answerIsTrue; - }; - } -} diff --git a/thinkphp/library/think/controller/Rest.php b/thinkphp/library/think/controller/Rest.php deleted file mode 100755 index a75cfd3..0000000 --- a/thinkphp/library/think/controller/Rest.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\controller; - -use think\App; -use think\Request; -use think\Response; - -abstract class Rest -{ - - protected $method; // 当前请求类型 - protected $type; // 当前资源类型 - // 输出类型 - protected $restMethodList = 'get|post|put|delete'; - protected $restDefaultMethod = 'get'; - protected $restTypeList = 'html|xml|json|rss'; - protected $restDefaultType = 'html'; - protected $restOutputType = [ // REST允许输出的资源类型列表 - 'xml' => 'application/xml', - 'json' => 'application/json', - 'html' => 'text/html', - ]; - - /** - * 架构函数 取得模板对象实例 - * @access public - */ - public function __construct() - { - // 资源类型检测 - $request = Request::instance(); - $ext = $request->ext(); - if ('' == $ext) { - // 自动检测资源类型 - $this->type = $request->type(); - } elseif (!preg_match('/\(' . $this->restTypeList . '\)$/i', $ext)) { - // 资源类型非法 则用默认资源类型访问 - $this->type = $this->restDefaultType; - } else { - $this->type = $ext; - } - // 请求方式检测 - $method = strtolower($request->method()); - if (false === stripos($this->restMethodList, $method)) { - // 请求方式非法 则用默认请求方法 - $method = $this->restDefaultMethod; - } - $this->method = $method; - } - - /** - * REST 调用 - * @access public - * @param string $method 方法名 - * @return mixed - * @throws \Exception - */ - public function _empty($method) - { - if (method_exists($this, $method . '_' . $this->method . '_' . $this->type)) { - // RESTFul方法支持 - $fun = $method . '_' . $this->method . '_' . $this->type; - } elseif ($this->method == $this->restDefaultMethod && method_exists($this, $method . '_' . $this->type)) { - $fun = $method . '_' . $this->type; - } elseif ($this->type == $this->restDefaultType && method_exists($this, $method . '_' . $this->method)) { - $fun = $method . '_' . $this->method; - } - if (isset($fun)) { - return App::invokeMethod([$this, $fun]); - } else { - // 抛出异常 - throw new \Exception('error action :' . $method); - } - } - - /** - * 输出返回数据 - * @access protected - * @param mixed $data 要返回的数据 - * @param String $type 返回类型 JSON XML - * @param integer $code HTTP状态码 - * @return Response - */ - protected function response($data, $type = 'json', $code = 200) - { - return Response::create($data, $type)->code($code); - } - -} diff --git a/thinkphp/library/think/controller/Yar.php b/thinkphp/library/think/controller/Yar.php deleted file mode 100755 index fcf5ced..0000000 --- a/thinkphp/library/think/controller/Yar.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\controller; - -/** - * ThinkPHP Yar控制器类 - */ -abstract class Yar -{ - - /** - * 架构函数 - * @access public - */ - public function __construct() - { - //控制器初始化 - if (method_exists($this, '_initialize')) { - $this->_initialize(); - } - - //判断扩展是否存在 - if (!extension_loaded('yar')) { - throw new \Exception('not support yar'); - } - - //实例化Yar_Server - $server = new \Yar_Server($this); - // 启动server - $server->handle(); - } - - /** - * 魔术方法 有不存在的操作的时候执行 - * @access public - * @param string $method 方法名 - * @param array $args 参数 - * @return mixed - */ - public function __call($method, $args) - {} -} diff --git a/thinkphp/library/think/db/Builder.php b/thinkphp/library/think/db/Builder.php deleted file mode 100755 index 69484ff..0000000 --- a/thinkphp/library/think/db/Builder.php +++ /dev/null @@ -1,766 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db; - -use PDO; -use think\Db; -use think\db\Connection; -use think\db\Query; -use think\Exception; - -abstract class Builder -{ - // connection对象实例 - protected $connection; - // 查询对象实例 - protected $query; - - // 数据库表达式 - protected $exp = ['eq' => '=', 'neq' => '<>', 'gt' => '>', 'egt' => '>=', 'lt' => '<', 'elt' => '<=', 'notlike' => 'NOT LIKE', 'like' => 'LIKE', 'in' => 'IN', 'exp' => 'EXP', 'notin' => 'NOT IN', 'not in' => 'NOT IN', 'between' => 'BETWEEN', 'not between' => 'NOT BETWEEN', 'notbetween' => 'NOT BETWEEN', 'exists' => 'EXISTS', 'notexists' => 'NOT EXISTS', 'not exists' => 'NOT EXISTS', 'null' => 'NULL', 'notnull' => 'NOT NULL', 'not null' => 'NOT NULL', '> time' => '> TIME', '< time' => '< TIME', '>= time' => '>= TIME', '<= time' => '<= TIME', 'between time' => 'BETWEEN TIME', 'not between time' => 'NOT BETWEEN TIME', 'notbetween time' => 'NOT BETWEEN TIME']; - - // SQL表达式 - protected $selectSql = 'SELECT%DISTINCT% %FIELD% FROM %TABLE%%FORCE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%LOCK%%COMMENT%'; - protected $insertSql = '%INSERT% INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%'; - protected $insertAllSql = 'INSERT INTO %TABLE% (%FIELD%) %DATA% %COMMENT%'; - protected $updateSql = 'UPDATE %TABLE% SET %SET% %JOIN% %WHERE% %ORDER%%LIMIT% %LOCK%%COMMENT%'; - protected $deleteSql = 'DELETE FROM %TABLE% %USING% %JOIN% %WHERE% %ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * 架构函数 - * @access public - * @param Connection $connection 数据库连接对象实例 - */ - public function __construct(Connection $connection) - { - $this->connection = $connection; - } - - /** - * 设置当前的Query对象实例 - * @access protected - * @param Query $query 当前查询对象实例 - * @return void - */ - public function setQuery(Query $query) - { - $this->query = $query; - } - - /** - * 将SQL语句中的__TABLE_NAME__字符串替换成带前缀的表名(小写) - * @access protected - * @param string $sql sql语句 - * @return string - */ - protected function parseSqlTable($sql) - { - return $this->query->parseSqlTable($sql); - } - - /** - * 数据分析 - * @access protected - * @param array $data 数据 - * @param array $options 查询参数 - * @return array - */ - protected function parseData($data, $options) - { - if (empty($data)) { - return []; - } - - // 获取绑定信息 - $bind = $this->query->getFieldsBind($options); - if ('*' == $options['field']) { - $fields = array_keys($bind); - } else { - $fields = $options['field']; - } - - $result = []; - foreach ($data as $key => $val) { - $item = $this->parseKey($key, $options); - if (!in_array($key, $fields, true)) { - if ($options['strict']) { - throw new Exception('fields not exists:[' . $key . ']'); - } - } elseif (isset($val[0]) && 'exp' == $val[0]) { - $result[$item] = $val[1]; - } elseif (is_null($val)) { - $result[$item] = 'NULL'; - } elseif (is_scalar($val)) { - // 过滤非标量数据 - if ($this->query->isBind(substr($val, 1))) { - $result[$item] = $val; - } else { - $this->query->bind($key, $val, isset($bind[$key]) ? $bind[$key] : PDO::PARAM_STR); - $result[$item] = ':' . $key; - } - } - } - return $result; - } - - /** - * 字段名分析 - * @access protected - * @param string $key - * @param array $options - * @return string - */ - protected function parseKey($key, $options = []) - { - return $key; - } - - /** - * value分析 - * @access protected - * @param mixed $value - * @param string $field - * @return string|array - */ - protected function parseValue($value, $field = '') - { - if (is_string($value)) { - $value = strpos($value, ':') === 0 && $this->query->isBind(substr($value, 1)) ? $value : $this->connection->quote($value); - } elseif (is_array($value)) { - $value = array_map([$this, 'parseValue'], $value); - } elseif (is_bool($value)) { - $value = $value ? '1' : '0'; - } elseif (is_null($value)) { - $value = 'null'; - } - return $value; - } - - /** - * field分析 - * @access protected - * @param mixed $fields - * @param array $options - * @return string - */ - protected function parseField($fields, $options = []) - { - if ('*' == $fields || empty($fields)) { - $fieldsStr = '*'; - } elseif (is_array($fields)) { - // 支持 'field1'=>'field2' 这样的字段别名定义 - $array = []; - foreach ($fields as $key => $field) { - if (!is_numeric($key)) { - $array[] = $this->parseKey($key, $options) . ' AS ' . $this->parseKey($field, $options); - } else { - $array[] = $this->parseKey($field, $options); - } - } - $fieldsStr = implode(',', $array); - } - return $fieldsStr; - } - - /** - * table分析 - * @access protected - * @param mixed $tables - * @param array $options - * @return string - */ - protected function parseTable($tables, $options = []) - { - $item = []; - foreach ((array) $tables as $key => $table) { - if (!is_numeric($key)) { - $key = $this->parseSqlTable($key); - $item[] = $this->parseKey($key) . ' ' . $this->parseKey($table); - } else { - $table = $this->parseSqlTable($table); - if (isset($options['alias'][$table])) { - $item[] = $this->parseKey($table) . ' ' . $this->parseKey($options['alias'][$table]); - } else { - $item[] = $this->parseKey($table); - } - } - } - return implode(',', $item); - } - - /** - * where分析 - * @access protected - * @param mixed $where 查询条件 - * @param array $options 查询参数 - * @return string - */ - protected function parseWhere($where, $options) - { - $whereStr = $this->buildWhere($where, $options); - return empty($whereStr) ? '' : ' WHERE ' . $whereStr; - } - - /** - * 生成查询条件SQL - * @access public - * @param mixed $where - * @param array $options - * @return string - */ - public function buildWhere($where, $options) - { - if (empty($where)) { - $where = []; - } - - if ($where instanceof Query) { - return $this->buildWhere($where->getOptions('where'), $options); - } - - $whereStr = ''; - $binds = $this->query->getFieldsBind($options); - foreach ($where as $key => $val) { - $str = []; - foreach ($val as $field => $value) { - if ($value instanceof \Closure) { - // 使用闭包查询 - $query = new Query($this->connection); - call_user_func_array($value, [ & $query]); - $str[] = ' ' . $key . ' ( ' . $this->buildWhere($query->getOptions('where'), $options) . ' )'; - } elseif (strpos($field, '|')) { - // 不同字段使用相同查询条件(OR) - $array = explode('|', $field); - $item = []; - foreach ($array as $k) { - $item[] = $this->parseWhereItem($k, $value, '', $options, $binds); - } - $str[] = ' ' . $key . ' ( ' . implode(' OR ', $item) . ' )'; - } elseif (strpos($field, '&')) { - // 不同字段使用相同查询条件(AND) - $array = explode('&', $field); - $item = []; - foreach ($array as $k) { - $item[] = $this->parseWhereItem($k, $value, '', $options, $binds); - } - $str[] = ' ' . $key . ' ( ' . implode(' AND ', $item) . ' )'; - } else { - // 对字段使用表达式查询 - $field = is_string($field) ? $field : ''; - $str[] = ' ' . $key . ' ' . $this->parseWhereItem($field, $value, $key, $options, $binds); - } - } - - $whereStr .= empty($whereStr) ? substr(implode(' ', $str), strlen($key) + 1) : implode(' ', $str); - } - return $whereStr; - } - - // where子单元分析 - protected function parseWhereItem($field, $val, $rule = '', $options = [], $binds = [], $bindName = null) - { - // 字段分析 - $key = $field ? $this->parseKey($field, $options) : ''; - - // 查询规则和条件 - if (!is_array($val)) { - $val = ['=', $val]; - } - list($exp, $value) = $val; - - // 对一个字段使用多个查询条件 - if (is_array($exp)) { - $item = array_pop($val); - // 传入 or 或者 and - if (is_string($item) && in_array($item, ['AND', 'and', 'OR', 'or'])) { - $rule = $item; - } else { - array_push($val, $item); - } - foreach ($val as $k => $item) { - $bindName = 'where_' . str_replace('.', '_', $field) . '_' . $k; - $str[] = $this->parseWhereItem($field, $item, $rule, $options, $binds, $bindName); - } - return '( ' . implode(' ' . $rule . ' ', $str) . ' )'; - } - - // 检测操作符 - if (!in_array($exp, $this->exp)) { - $exp = strtolower($exp); - if (isset($this->exp[$exp])) { - $exp = $this->exp[$exp]; - } else { - throw new Exception('where express error:' . $exp); - } - } - $bindName = $bindName ?: 'where_' . str_replace('.', '_', $field); - $bindType = isset($binds[$field]) ? $binds[$field] : PDO::PARAM_STR; - if (is_scalar($value) && array_key_exists($field, $binds) && !in_array($exp, ['EXP', 'NOT NULL', 'NULL', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN']) && strpos($exp, 'TIME') === false) { - if (strpos($value, ':') !== 0 || !$this->query->isBind(substr($value, 1))) { - if ($this->query->isBind($bindName)) { - $bindName .= '_' . uniqid(); - } - $this->query->bind($bindName, $value, $bindType); - $value = ':' . $bindName; - } - } - - $whereStr = ''; - if (in_array($exp, ['=', '<>', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE'])) { - // 比较运算 及 模糊匹配 - $whereStr .= $key . ' ' . $exp . ' ' . $this->parseValue($value, $field); - } elseif ('EXP' == $exp) { - // 表达式查询 - $whereStr .= '( ' . $key . ' ' . $value . ' )'; - } elseif (in_array($exp, ['NOT NULL', 'NULL'])) { - // NULL 查询 - $whereStr .= $key . ' IS ' . $exp; - } elseif (in_array($exp, ['NOT IN', 'IN'])) { - // IN 查询 - if ($value instanceof \Closure) { - $whereStr .= $key . ' ' . $exp . ' ' . $this->parseClosure($value); - } else { - $value = is_array($value) ? $value : explode(',', $value); - if (array_key_exists($field, $binds)) { - $bind = []; - $array = []; - foreach ($value as $k => $v) { - $bind[$bindName . '_in_' . $k] = [$v, $bindType]; - $array[] = ':' . $bindName . '_in_' . $k; - } - $this->query->bind($bind); - $zone = implode(',', $array); - } else { - $zone = implode(',', $this->parseValue($value, $field)); - } - $whereStr .= $key . ' ' . $exp . ' (' . $zone . ')'; - } - } elseif (in_array($exp, ['NOT BETWEEN', 'BETWEEN'])) { - // BETWEEN 查询 - $data = is_array($value) ? $value : explode(',', $value); - if (array_key_exists($field, $binds)) { - $bind = [ - $bindName . '_between_1' => [$data[0], $bindType], - $bindName . '_between_2' => [$data[1], $bindType], - ]; - $this->query->bind($bind); - $between = ':' . $bindName . '_between_1' . ' AND :' . $bindName . '_between_2'; - } else { - $between = $this->parseValue($data[0], $field) . ' AND ' . $this->parseValue($data[1], $field); - } - $whereStr .= $key . ' ' . $exp . ' ' . $between; - } elseif (in_array($exp, ['NOT EXISTS', 'EXISTS'])) { - // EXISTS 查询 - if ($value instanceof \Closure) { - $whereStr .= $exp . ' ' . $this->parseClosure($value); - } else { - $whereStr .= $exp . ' (' . $value . ')'; - } - } elseif (in_array($exp, ['< TIME', '> TIME', '<= TIME', '>= TIME'])) { - $whereStr .= $key . ' ' . substr($exp, 0, 2) . ' ' . $this->parseDateTime($value, $field, $options, $bindName, $bindType); - } elseif (in_array($exp, ['BETWEEN TIME', 'NOT BETWEEN TIME'])) { - if (is_string($value)) { - $value = explode(',', $value); - } - - $whereStr .= $key . ' ' . substr($exp, 0, -4) . $this->parseDateTime($value[0], $field, $options, $bindName . '_between_1', $bindType) . ' AND ' . $this->parseDateTime($value[1], $field, $options, $bindName . '_between_2', $bindType); - } - return $whereStr; - } - - // 执行闭包子查询 - protected function parseClosure($call, $show = true) - { - $query = new Query($this->connection); - call_user_func_array($call, [ & $query]); - return $query->buildSql($show); - } - - /** - * 日期时间条件解析 - * @access protected - * @param string $value - * @param string $key - * @param array $options - * @param string $bindName - * @param integer $bindType - * @return string - */ - protected function parseDateTime($value, $key, $options = [], $bindName = null, $bindType = null) - { - // 获取时间字段类型 - $type = $this->query->getFieldsType($options); - if (isset($type[$key])) { - $info = $type[$key]; - } - if (isset($info)) { - $value = strtotime($value) ?: $value; - if (preg_match('/(datetime|timestamp)/is', $info)) { - // 日期及时间戳类型 - $value = date('Y-m-d H:i:s', $value); - } elseif (preg_match('/(date)/is', $info)) { - // 日期及时间戳类型 - $value = date('Y-m-d', $value); - } - } - $bindName = $bindName ?: $key; - $this->query->bind($bindName, $value, $bindType); - return ':' . $bindName; - } - - /** - * limit分析 - * @access protected - * @param mixed $lmit - * @return string - */ - protected function parseLimit($limit) - { - return (!empty($limit) && false === strpos($limit, '(')) ? ' LIMIT ' . $limit . ' ' : ''; - } - - /** - * join分析 - * @access protected - * @param array $join - * @param array $options 查询条件 - * @return string - */ - protected function parseJoin($join, $options = []) - { - $joinStr = ''; - if (!empty($join)) { - foreach ($join as $item) { - list($table, $type, $on) = $item; - $condition = []; - foreach ((array) $on as $val) { - if (strpos($val, '=')) { - list($val1, $val2) = explode('=', $val, 2); - $condition[] = $this->parseKey($val1, $options) . '=' . $this->parseKey($val2, $options); - } else { - $condition[] = $val; - } - } - - $table = $this->parseTable($table, $options); - $joinStr .= ' ' . $type . ' JOIN ' . $table . ' ON ' . implode(' AND ', $condition); - } - } - return $joinStr; - } - - /** - * order分析 - * @access protected - * @param mixed $order - * @param array $options 查询条件 - * @return string - */ - protected function parseOrder($order, $options = []) - { - if (is_array($order)) { - $array = []; - foreach ($order as $key => $val) { - if (is_numeric($key)) { - if (false === strpos($val, '(')) { - $array[] = $this->parseKey($val, $options); - } elseif ('[rand]' == $val) { - $array[] = $this->parseRand(); - } - } else { - $sort = in_array(strtolower(trim($val)), ['asc', 'desc']) ? ' ' . $val : ''; - $array[] = $this->parseKey($key, $options) . ' ' . $sort; - } - } - $order = implode(',', $array); - } - return !empty($order) ? ' ORDER BY ' . $order : ''; - } - - /** - * group分析 - * @access protected - * @param mixed $group - * @return string - */ - protected function parseGroup($group) - { - return !empty($group) ? ' GROUP BY ' . $group : ''; - } - - /** - * having分析 - * @access protected - * @param string $having - * @return string - */ - protected function parseHaving($having) - { - return !empty($having) ? ' HAVING ' . $having : ''; - } - - /** - * comment分析 - * @access protected - * @param string $comment - * @return string - */ - protected function parseComment($comment) - { - return !empty($comment) ? ' /* ' . $comment . ' */' : ''; - } - - /** - * distinct分析 - * @access protected - * @param mixed $distinct - * @return string - */ - protected function parseDistinct($distinct) - { - return !empty($distinct) ? ' DISTINCT ' : ''; - } - - /** - * union分析 - * @access protected - * @param mixed $union - * @return string - */ - protected function parseUnion($union) - { - if (empty($union)) { - return ''; - } - $type = $union['type']; - unset($union['type']); - foreach ($union as $u) { - if ($u instanceof \Closure) { - $sql[] = $type . ' ' . $this->parseClosure($u, false); - } elseif (is_string($u)) { - $sql[] = $type . ' ' . $this->parseSqlTable($u); - } - } - return implode(' ', $sql); - } - - /** - * index分析,可在操作链中指定需要强制使用的索引 - * @access protected - * @param mixed $index - * @return string - */ - protected function parseForce($index) - { - if (empty($index)) { - return ''; - } - - if (is_array($index)) { - $index = join(",", $index); - } - - return sprintf(" FORCE INDEX ( %s ) ", $index); - } - - /** - * 设置锁机制 - * @access protected - * @param bool $locl - * @return string - */ - protected function parseLock($lock = false) - { - return $lock ? ' FOR UPDATE ' : ''; - } - - /** - * 生成查询SQL - * @access public - * @param array $options 表达式 - * @return string - */ - public function select($options = []) - { - $sql = str_replace( - ['%TABLE%', '%DISTINCT%', '%FIELD%', '%JOIN%', '%WHERE%', '%GROUP%', '%HAVING%', '%ORDER%', '%LIMIT%', '%UNION%', '%LOCK%', '%COMMENT%', '%FORCE%'], - [ - $this->parseTable($options['table'], $options), - $this->parseDistinct($options['distinct']), - $this->parseField($options['field'], $options), - $this->parseJoin($options['join'], $options), - $this->parseWhere($options['where'], $options), - $this->parseGroup($options['group']), - $this->parseHaving($options['having']), - $this->parseOrder($options['order'], $options), - $this->parseLimit($options['limit']), - $this->parseUnion($options['union']), - $this->parseLock($options['lock']), - $this->parseComment($options['comment']), - $this->parseForce($options['force']), - ], $this->selectSql); - return $sql; - } - - /** - * 生成insert SQL - * @access public - * @param array $data 数据 - * @param array $options 表达式 - * @param bool $replace 是否replace - * @return string - */ - public function insert(array $data, $options = [], $replace = false) - { - // 分析并处理数据 - $data = $this->parseData($data, $options); - if (empty($data)) { - return 0; - } - $fields = array_keys($data); - $values = array_values($data); - - $sql = str_replace( - ['%INSERT%', '%TABLE%', '%FIELD%', '%DATA%', '%COMMENT%'], - [ - $replace ? 'REPLACE' : 'INSERT', - $this->parseTable($options['table'], $options), - implode(' , ', $fields), - implode(' , ', $values), - $this->parseComment($options['comment']), - ], $this->insertSql); - - return $sql; - } - - /** - * 生成insertall SQL - * @access public - * @param array $dataSet 数据集 - * @param array $options 表达式 - * @return string - */ - public function insertAll($dataSet, $options) - { - // 获取合法的字段 - if ('*' == $options['field']) { - $fields = array_keys($this->query->getFieldsType($options)); - } else { - $fields = $options['field']; - } - - foreach ($dataSet as &$data) { - foreach ($data as $key => $val) { - if (!in_array($key, $fields, true)) { - if ($options['strict']) { - throw new Exception('fields not exists:[' . $key . ']'); - } - unset($data[$key]); - } elseif (is_scalar($val)) { - $data[$key] = $this->parseValue($val, $key); - } else { - // 过滤掉非标量数据 - unset($data[$key]); - } - } - $value = array_values($data); - $values[] = 'SELECT ' . implode(',', $value); - } - $fields = array_map([$this, 'parseKey'], array_keys(reset($dataSet))); - $sql = str_replace( - ['%TABLE%', '%FIELD%', '%DATA%', '%COMMENT%'], - [ - $this->parseTable($options['table'], $options), - implode(' , ', $fields), - implode(' UNION ALL ', $values), - $this->parseComment($options['comment']), - ], $this->insertAllSql); - - return $sql; - } - - /** - * 生成slectinsert SQL - * @access public - * @param array $fields 数据 - * @param string $table 数据表 - * @param array $options 表达式 - * @return string - */ - public function selectInsert($fields, $table, $options) - { - if (is_string($fields)) { - $fields = explode(',', $fields); - } - - $fields = array_map([$this, 'parseKey'], $fields); - $sql = 'INSERT INTO ' . $this->parseTable($table, $options) . ' (' . implode(',', $fields) . ') ' . $this->select($options); - return $sql; - } - - /** - * 生成update SQL - * @access public - * @param array $fields 数据 - * @param array $options 表达式 - * @return string - */ - public function update($data, $options) - { - $table = $this->parseTable($options['table'], $options); - $data = $this->parseData($data, $options); - if (empty($data)) { - return ''; - } - foreach ($data as $key => $val) { - $set[] = $key . '=' . $val; - } - - $sql = str_replace( - ['%TABLE%', '%SET%', '%JOIN%', '%WHERE%', '%ORDER%', '%LIMIT%', '%LOCK%', '%COMMENT%'], - [ - $this->parseTable($options['table'], $options), - implode(',', $set), - $this->parseJoin($options['join'], $options), - $this->parseWhere($options['where'], $options), - $this->parseOrder($options['order'], $options), - $this->parseLimit($options['limit']), - $this->parseLock($options['lock']), - $this->parseComment($options['comment']), - ], $this->updateSql); - - return $sql; - } - - /** - * 生成delete SQL - * @access public - * @param array $options 表达式 - * @return string - */ - public function delete($options) - { - $sql = str_replace( - ['%TABLE%', '%USING%', '%JOIN%', '%WHERE%', '%ORDER%', '%LIMIT%', '%LOCK%', '%COMMENT%'], - [ - $this->parseTable($options['table'], $options), - !empty($options['using']) ? ' USING ' . $this->parseTable($options['using'], $options) . ' ' : '', - $this->parseJoin($options['join'], $options), - $this->parseWhere($options['where'], $options), - $this->parseOrder($options['order'], $options), - $this->parseLimit($options['limit']), - $this->parseLock($options['lock']), - $this->parseComment($options['comment']), - ], $this->deleteSql); - - return $sql; - } -} diff --git a/thinkphp/library/think/db/Connection.php b/thinkphp/library/think/db/Connection.php deleted file mode 100755 index 9806b82..0000000 --- a/thinkphp/library/think/db/Connection.php +++ /dev/null @@ -1,912 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db; - -use PDO; -use PDOStatement; -use think\Collection; -use think\Db; -use think\db\exception\BindParamException; -use think\db\Query; -use think\Debug; -use think\Exception; -use think\exception\PDOException; -use think\Log; - -/** - * Class Connection - * @package think - * @method Query table(string $table) 指定数据表(含前缀) - * @method Query name(string $name) 指定数据表(不含前缀) - * - */ -abstract class Connection -{ - - /** @var PDOStatement PDO操作实例 */ - protected $PDOStatement; - - /** @var string 当前SQL指令 */ - protected $queryStr = ''; - // 返回或者影响记录数 - protected $numRows = 0; - // 事务指令数 - protected $transTimes = 0; - // 错误信息 - protected $error = ''; - - /** @var PDO[] 数据库连接ID 支持多个连接 */ - protected $links = []; - - /** @var PDO 当前连接ID */ - protected $linkID; - protected $linkRead; - protected $linkWrite; - - // 查询结果类型 - protected $resultSetType = 'array'; - // 查询结果类型 - protected $fetchType = PDO::FETCH_ASSOC; - // 字段属性大小写 - protected $attrCase = PDO::CASE_LOWER; - // 监听回调 - protected static $event = []; - // 查询对象 - protected $query = []; - // 数据库连接参数配置 - protected $config = [ - // 数据库类型 - 'type' => '', - // 服务器地址 - 'hostname' => '', - // 数据库名 - 'database' => '', - // 用户名 - 'username' => '', - // 密码 - 'password' => '', - // 端口 - 'hostport' => '', - // 连接dsn - 'dsn' => '', - // 数据库连接参数 - 'params' => [], - // 数据库编码默认采用utf8 - 'charset' => 'utf8', - // 数据库表前缀 - 'prefix' => '', - // 数据库调试模式 - 'debug' => false, - // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'deploy' => 0, - // 数据库读写是否分离 主从式有效 - 'rw_separate' => false, - // 读写分离后 主服务器数量 - 'master_num' => 1, - // 指定从服务器序号 - 'slave_no' => '', - // 是否严格检查字段是否存在 - 'fields_strict' => true, - // 数据集返回类型 - 'resultset_type' => 'array', - // 自动写入时间戳字段 - 'auto_timestamp' => false, - // 是否需要进行SQL性能分析 - 'sql_explain' => false, - // Builder类 - 'builder' => '', - // Query类 - 'query' => '\\think\\db\\Query', - ]; - - // PDO连接参数 - protected $params = [ - PDO::ATTR_CASE => PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - PDO::ATTR_EMULATE_PREPARES => false, - ]; - - /** - * 架构函数 读取数据库配置信息 - * @access public - * @param array $config 数据库配置数组 - */ - public function __construct(array $config = []) - { - if (!empty($config)) { - $this->config = array_merge($this->config, $config); - } - } - - /** - * 创建指定模型的查询对象 - * @access public - * @param string $model 模型类名称 - * @param string $queryClass 查询对象类名 - * @return Query - */ - public function model($model, $queryClass = '') - { - if (!isset($this->query[$model])) { - $class = $queryClass ?: $this->config['query']; - $this->query[$model] = new $class($this, $model); - } - return $this->query[$model]; - } - - /** - * 调用Query类的查询方法 - * @access public - * @param string $method 方法名称 - * @param array $args 调用参数 - * @return mixed - */ - public function __call($method, $args) - { - if (!isset($this->query['database'])) { - $class = $this->config['query']; - $this->query['database'] = new $class($this); - } - return call_user_func_array([$this->query['database'], $method], $args); - } - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - abstract protected function parseDsn($config); - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - abstract public function getFields($tableName); - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName - * @return array - */ - abstract public function getTables($dbName); - - /** - * SQL性能分析 - * @access protected - * @param string $sql - * @return array - */ - abstract protected function getExplain($sql); - - /** - * 对返数据表字段信息进行大小写转换出来 - * @access public - * @param array $info 字段信息 - * @return array - */ - public function fieldCase($info) - { - // 字段大小写转换 - switch ($this->attrCase) { - case PDO::CASE_LOWER: - $info = array_change_key_case($info); - break; - case PDO::CASE_UPPER: - $info = array_change_key_case($info, CASE_UPPER); - break; - case PDO::CASE_NATURAL: - default: - // 不做转换 - } - return $info; - } - - /** - * 获取数据库的配置参数 - * @access public - * @param string $config 配置名称 - * @return mixed - */ - public function getConfig($config = '') - { - return $config ? $this->config[$config] : $this->config; - } - - /** - * 设置数据库的配置参数 - * @access public - * @param string|array $config 配置名称 - * @param mixed $value 配置值 - * @return void - */ - public function setConfig($config, $value = '') - { - if (is_array($config)) { - $this->config = array_merge($this->config, $config); - } else { - $this->config[$config] = $value; - } - } - - /** - * 连接数据库方法 - * @access public - * @param array $config 连接参数 - * @param integer $linkNum 连接序号 - * @param array|bool $autoConnection 是否自动连接主数据库(用于分布式) - * @return PDO - * @throws Exception - */ - public function connect(array $config = [], $linkNum = 0, $autoConnection = false) - { - if (!isset($this->links[$linkNum])) { - if (!$config) { - $config = $this->config; - } else { - $config = array_merge($this->config, $config); - } - // 连接参数 - if (isset($config['params']) && is_array($config['params'])) { - $params = $config['params'] + $this->params; - } else { - $params = $this->params; - } - // 记录当前字段属性大小写设置 - $this->attrCase = $params[PDO::ATTR_CASE]; - // 记录数据集返回类型 - if (isset($config['resultset_type'])) { - $this->resultSetType = $config['resultset_type']; - } - try { - if (empty($config['dsn'])) { - $config['dsn'] = $this->parseDsn($config); - } - if ($config['debug']) { - $startTime = microtime(true); - } - $this->links[$linkNum] = new PDO($config['dsn'], $config['username'], $config['password'], $params); - if ($config['debug']) { - // 记录数据库连接信息 - Log::record('[ DB ] CONNECT:[ UseTime:' . number_format(microtime(true) - $startTime, 6) . 's ] ' . $config['dsn'], 'sql'); - } - } catch (\PDOException $e) { - if ($autoConnection) { - Log::record($e->getMessage(), 'error'); - return $this->connect($autoConnection, $linkNum); - } else { - throw $e; - } - } - } - return $this->links[$linkNum]; - } - - /** - * 释放查询结果 - * @access public - */ - public function free() - { - $this->PDOStatement = null; - } - - /** - * 获取PDO对象 - * @access public - * @return \PDO|false - */ - public function getPdo() - { - if (!$this->linkID) { - return false; - } else { - return $this->linkID; - } - } - - /** - * 执行查询 返回数据集 - * @access public - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @param boolean $master 是否在主服务器读操作 - * @param bool|string $class 指定返回的数据集对象 - * @return mixed - * @throws BindParamException - * @throws PDOException - */ - public function query($sql, $bind = [], $master = false, $class = false) - { - $this->initConnect($master); - if (!$this->linkID) { - return false; - } - // 根据参数绑定组装最终的SQL语句 - $this->queryStr = $this->getRealSql($sql, $bind); - - //释放前次的查询结果 - if (!empty($this->PDOStatement)) { - $this->free(); - } - - Db::$queryTimes++; - try { - // 调试开始 - $this->debug(true); - // 预处理 - $this->PDOStatement = $this->linkID->prepare($sql); - // 参数绑定 - $this->bindValue($bind); - // 执行查询 - $result = $this->PDOStatement->execute(); - // 调试结束 - $this->debug(false); - $procedure = in_array(strtolower(substr(trim($sql), 0, 4)), ['call', 'exec']); - return $this->getResult($class, $procedure); - } catch (\PDOException $e) { - throw new PDOException($e, $this->config, $this->queryStr); - } - } - - /** - * 执行语句 - * @access public - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @return int - * @throws BindParamException - * @throws PDOException - */ - public function execute($sql, $bind = []) - { - $this->initConnect(true); - if (!$this->linkID) { - return false; - } - // 根据参数绑定组装最终的SQL语句 - $this->queryStr = $this->getRealSql($sql, $bind); - - //释放前次的查询结果 - if (!empty($this->PDOStatement)) { - $this->free(); - } - - Db::$executeTimes++; - try { - // 调试开始 - $this->debug(true); - // 预处理 - $this->PDOStatement = $this->linkID->prepare($sql); - // 参数绑定操作 - $this->bindValue($bind); - // 执行语句 - $result = $this->PDOStatement->execute(); - // 调试结束 - $this->debug(false); - - $this->numRows = $this->PDOStatement->rowCount(); - return $this->numRows; - } catch (\PDOException $e) { - throw new PDOException($e, $this->config, $this->queryStr); - } - } - - /** - * 根据参数绑定组装最终的SQL语句 便于调试 - * @access public - * @param string $sql 带参数绑定的sql语句 - * @param array $bind 参数绑定列表 - * @return string - */ - public function getRealSql($sql, array $bind = []) - { - if ($bind) { - foreach ($bind as $key => $val) { - $value = is_array($val) ? $val[0] : $val; - $type = is_array($val) ? $val[1] : PDO::PARAM_STR; - if (PDO::PARAM_STR == $type) { - $value = $this->quote($value); - } elseif (PDO::PARAM_INT == $type && '' === $value) { - $value = 0; - } - // 判断占位符 - $sql = is_numeric($key) ? - substr_replace($sql, $value, strpos($sql, '?'), 1) : - str_replace( - [':' . $key . ')', ':' . $key . ',', ':' . $key . ' '], - [$value . ')', $value . ',', $value . ' '], - $sql . ' '); - } - } - return rtrim($sql); - } - - /** - * 参数绑定 - * 支持 ['name'=>'value','id'=>123] 对应命名占位符 - * 或者 ['value',123] 对应问号占位符 - * @access public - * @param array $bind 要绑定的参数列表 - * @return void - * @throws \think\Exception - */ - protected function bindValue(array $bind = []) - { - foreach ($bind as $key => $val) { - // 占位符 - $param = is_numeric($key) ? $key + 1 : ':' . $key; - if (is_array($val)) { - if (PDO::PARAM_INT == $val[1] && '' === $val[0]) { - $val[0] = 0; - } - $result = $this->PDOStatement->bindValue($param, $val[0], $val[1]); - } else { - $result = $this->PDOStatement->bindValue($param, $val); - } - if (!$result) { - throw new BindParamException( - "Error occurred when binding parameters '{$param}'", - $this->config, - $this->queryStr, - $bind - ); - } - } - } - - /** - * 获得数据集 - * @access protected - * @param bool|string $class true 返回PDOStatement 字符串用于指定返回的类名 - * @param bool $procedure 是否存储过程 - * @return mixed - */ - protected function getResult($class = '', $procedure = false) - { - if (true === $class) { - // 返回PDOStatement对象处理 - return $this->PDOStatement; - } - if ($procedure) { - // 存储过程返回结果 - return $this->procedure($class); - } - $result = $this->PDOStatement->fetchAll($this->fetchType); - $this->numRows = count($result); - - if (!empty($class)) { - // 返回指定数据集对象类 - $result = new $class($result); - } elseif ('collection' == $this->resultSetType) { - // 返回数据集Collection对象 - $result = new Collection($result); - } - return $result; - } - - /** - * 获得存储过程数据集 - * @access protected - * @param bool|string $class true 返回PDOStatement 字符串用于指定返回的类名 - * @return array - */ - protected function procedure($class) - { - $item = []; - do { - $result = $this->getResult($class); - if ($result) { - $item[] = $result; - } - } while ($this->PDOStatement->nextRowset()); - $this->numRows = count($item); - return $item; - } - - /** - * 执行数据库事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @return mixed - * @throws PDOException - * @throws \Exception - * @throws \Throwable - */ - public function transaction($callback) - { - $this->startTrans(); - try { - $result = null; - if (is_callable($callback)) { - $result = call_user_func_array($callback, [$this]); - } - $this->commit(); - return $result; - } catch (\Exception $e) { - $this->rollback(); - throw $e; - } catch (\Throwable $e) { - $this->rollback(); - throw $e; - } - } - - /** - * 启动事务 - * @access public - * @return void - */ - public function startTrans() - { - $this->initConnect(true); - if (!$this->linkID) { - return false; - } - - ++$this->transTimes; - - if (1 == $this->transTimes) { - $this->linkID->beginTransaction(); - } elseif ($this->transTimes > 1 && $this->supportSavepoint()) { - $this->linkID->exec( - $this->parseSavepoint('trans' . $this->transTimes) - ); - } - } - - /** - * 用于非自动提交状态下面的查询提交 - * @access public - * @return void - * @throws PDOException - */ - public function commit() - { - $this->initConnect(true); - - if (1 == $this->transTimes) { - $this->linkID->commit(); - } - - --$this->transTimes; - } - - /** - * 事务回滚 - * @access public - * @return void - * @throws PDOException - */ - public function rollback() - { - $this->initConnect(true); - - if (1 == $this->transTimes) { - $this->linkID->rollBack(); - } elseif ($this->transTimes > 1 && $this->supportSavepoint()) { - $this->linkID->exec( - $this->parseSavepointRollBack('trans' . $this->transTimes) - ); - } - - $this->transTimes = max(0, $this->transTimes - 1); - } - - /** - * 是否支持事务嵌套 - * @return bool - */ - protected function supportSavepoint() - { - return false; - } - - /** - * 生成定义保存点的SQL - * @param $name - * @return string - */ - protected function parseSavepoint($name) - { - return 'SAVEPOINT ' . $name; - } - - /** - * 生成回滚到保存点的SQL - * @param $name - * @return string - */ - protected function parseSavepointRollBack($name) - { - return 'ROLLBACK TO SAVEPOINT ' . $name; - } - - /** - * 批处理执行SQL语句 - * 批处理的指令都认为是execute操作 - * @access public - * @param array $sqlArray SQL批处理指令 - * @return boolean - */ - public function batchQuery($sqlArray = []) - { - if (!is_array($sqlArray)) { - return false; - } - // 自动启动事务支持 - $this->startTrans(); - try { - foreach ($sqlArray as $sql) { - $this->execute($sql); - } - // 提交事务 - $this->commit(); - } catch (\Exception $e) { - $this->rollback(); - throw $e; - } - return true; - } - - /** - * 获得查询次数 - * @access public - * @param boolean $execute 是否包含所有查询 - * @return integer - */ - public function getQueryTimes($execute = false) - { - return $execute ? Db::$queryTimes + Db::$executeTimes : Db::$queryTimes; - } - - /** - * 获得执行次数 - * @access public - * @return integer - */ - public function getExecuteTimes() - { - return Db::$executeTimes; - } - - /** - * 关闭数据库 - * @access public - */ - public function close() - { - $this->linkID = null; - } - - /** - * 获取最近一次查询的sql语句 - * @access public - * @return string - */ - public function getLastSql() - { - return $this->queryStr; - } - - /** - * 获取最近插入的ID - * @access public - * @param string $sequence 自增序列名 - * @return string - */ - public function getLastInsID($sequence = null) - { - return $this->linkID->lastInsertId($sequence); - } - - /** - * 获取返回或者影响的记录数 - * @access public - * @return integer - */ - public function getNumRows() - { - return $this->numRows; - } - - /** - * 获取最近的错误信息 - * @access public - * @return string - */ - public function getError() - { - if ($this->PDOStatement) { - $error = $this->PDOStatement->errorInfo(); - $error = $error[1] . ':' . $error[2]; - } else { - $error = ''; - } - if ('' != $this->queryStr) { - $error .= "\n [ SQL语句 ] : " . $this->queryStr; - } - return $error; - } - - /** - * SQL指令安全过滤 - * @access public - * @param string $str SQL字符串 - * @param bool $master 是否主库查询 - * @return string - */ - public function quote($str, $master = true) - { - $this->initConnect($master); - return $this->linkID ? $this->linkID->quote($str) : $str; - } - - /** - * 数据库调试 记录当前SQL及分析性能 - * @access protected - * @param boolean $start 调试开始标记 true 开始 false 结束 - * @param string $sql 执行的SQL语句 留空自动获取 - * @return void - */ - protected function debug($start, $sql = '') - { - if (!empty($this->config['debug'])) { - // 开启数据库调试模式 - if ($start) { - Debug::remark('queryStartTime', 'time'); - } else { - // 记录操作结束时间 - Debug::remark('queryEndTime', 'time'); - $runtime = Debug::getRangeTime('queryStartTime', 'queryEndTime'); - $sql = $sql ?: $this->queryStr; - $log = $sql . ' [ RunTime:' . $runtime . 's ]'; - $result = []; - // SQL性能分析 - if ($this->config['sql_explain'] && 0 === stripos(trim($sql), 'select')) { - $result = $this->getExplain($sql); - } - // SQL监听 - $this->trigger($sql, $runtime, $result); - } - } - } - - /** - * 监听SQL执行 - * @access public - * @param callable $callback 回调方法 - * @return void - */ - public function listen($callback) - { - self::$event[] = $callback; - } - - /** - * 触发SQL事件 - * @access protected - * @param string $sql SQL语句 - * @param float $runtime SQL运行时间 - * @param mixed $explain SQL分析 - * @return bool - */ - protected function trigger($sql, $runtime, $explain = []) - { - if (!empty(self::$event)) { - foreach (self::$event as $callback) { - if (is_callable($callback)) { - call_user_func_array($callback, [$sql, $runtime, $explain]); - } - } - } else { - // 未注册监听则记录到日志中 - Log::record('[ SQL ] ' . $sql . ' [ RunTime:' . $runtime . 's ]', 'sql'); - if (!empty($explain)) { - Log::record('[ EXPLAIN : ' . var_export($explain, true) . ' ]', 'sql'); - } - } - } - - /** - * 初始化数据库连接 - * @access protected - * @param boolean $master 是否主服务器 - * @return void - */ - protected function initConnect($master = true) - { - if (!empty($this->config['deploy'])) { - // 采用分布式数据库 - if ($master) { - if (!$this->linkWrite) { - $this->linkWrite = $this->multiConnect(true); - } - $this->linkID = $this->linkWrite; - } else { - if (!$this->linkRead) { - $this->linkRead = $this->multiConnect(false); - } - $this->linkID = $this->linkRead; - } - } elseif (!$this->linkID) { - // 默认单数据库 - $this->linkID = $this->connect(); - } - } - - /** - * 连接分布式服务器 - * @access protected - * @param boolean $master 主服务器 - * @return PDO - */ - protected function multiConnect($master = false) - { - $_config = []; - // 分布式数据库配置解析 - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn', 'charset'] as $name) { - $_config[$name] = explode(',', $this->config[$name]); - } - - // 主服务器序号 - $m = floor(mt_rand(0, $this->config['master_num'] - 1)); - - if ($this->config['rw_separate']) { - // 主从式采用读写分离 - if ($master) // 主服务器写入 - { - $r = $m; - } elseif (is_numeric($this->config['slave_no'])) { - // 指定服务器读 - $r = $this->config['slave_no']; - } else { - // 读操作连接从服务器 每次随机连接的数据库 - $r = floor(mt_rand($this->config['master_num'], count($_config['hostname']) - 1)); - } - } else { - // 读写操作不区分服务器 每次随机连接的数据库 - $r = floor(mt_rand(0, count($_config['hostname']) - 1)); - } - $dbMaster = false; - if ($m != $r) { - $dbMaster = []; - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn', 'charset'] as $name) { - $dbMaster[$name] = isset($_config[$name][$m]) ? $_config[$name][$m] : $_config[$name][0]; - } - } - $dbConfig = []; - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn', 'charset'] as $name) { - $dbConfig[$name] = isset($_config[$name][$r]) ? $_config[$name][$r] : $_config[$name][0]; - } - return $this->connect($dbConfig, $r, $r == $m ? false : $dbMaster); - } - - /** - * 析构方法 - * @access public - */ - public function __destruct() - { - // 释放查询 - if ($this->PDOStatement) { - $this->free(); - } - // 关闭连接 - $this->close(); - } -} diff --git a/thinkphp/library/think/db/Query.php b/thinkphp/library/think/db/Query.php deleted file mode 100755 index 3f4d5fd..0000000 --- a/thinkphp/library/think/db/Query.php +++ /dev/null @@ -1,2311 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db; - -use PDO; -use think\Cache; -use think\Collection; -use think\Config; -use think\Db; -use think\db\Builder; -use think\db\Connection; -use think\db\exception\BindParamException; -use think\db\exception\DataNotFoundException; -use think\db\exception\ModelNotFoundException; -use think\Exception; -use think\exception\DbException; -use think\exception\PDOException; -use think\Loader; -use think\Model; -use think\model\Relation; -use think\Paginator; - -class Query -{ - // 数据库Connection对象实例 - protected $connection; - // 数据库驱动类型 - protected $builder; - // 当前模型类名称 - protected $model; - // 当前数据表名称(含前缀) - protected $table = ''; - // 当前数据表名称(不含前缀) - protected $name = ''; - // 当前数据表主键 - protected $pk; - // 当前数据表前缀 - protected $prefix = ''; - // 查询参数 - protected $options = []; - // 参数绑定 - protected $bind = []; - // 数据表信息 - protected static $info = []; - - /** - * 架构函数 - * @access public - * @param Connection $connection 数据库对象实例 - * @param string $model 模型名 - */ - public function __construct(Connection $connection = null, $model = '') - { - $this->connection = $connection ?: Db::connect([], true); - $this->builder = $this->connection->getConfig('builder') ?: $this->connection->getConfig('type'); - $this->prefix = $this->connection->getConfig('prefix'); - $this->model = $model; - } - - /** - * 利用__call方法实现一些特殊的Model方法 - * @access public - * @param string $method 方法名称 - * @param array $args 调用参数 - * @return mixed - * @throws DbException - * @throws Exception - */ - public function __call($method, $args) - { - if (strtolower(substr($method, 0, 5)) == 'getby') { - // 根据某个字段获取记录 - $field = Loader::parseName(substr($method, 5)); - $where[$field] = $args[0]; - return $this->where($where)->find(); - } elseif (strtolower(substr($method, 0, 10)) == 'getfieldby') { - // 根据某个字段获取记录的某个值 - $name = Loader::parseName(substr($method, 10)); - $where[$name] = $args[0]; - return $this->where($where)->value($args[1]); - } else { - throw new Exception('method not exist:' . __CLASS__ . '->' . $method); - } - } - - /** - * 获取当前的数据库Connection对象 - * @access public - * @return Connection - */ - public function getConnection() - { - return $this->connection; - } - - /** - * 切换当前的数据库连接 - * @access public - * @param mixed $config - * @return $this - */ - public function connect($config) - { - $this->connection = Db::connect($config); - return $this; - } - - /** - * 指定默认的数据表名(不含前缀) - * @access public - * @param string $name - * @return $this - */ - public function name($name) - { - $this->name = $name; - return $this; - } - - /** - * 指定默认数据表名(含前缀) - * @access public - * @param string $table 表名 - * @return $this - */ - public function setTable($table) - { - $this->table = $table; - return $this; - } - - /** - * 得到当前或者指定名称的数据表 - * @access public - * @param string $name - * @return string - */ - public function getTable($name = '') - { - if ($name || empty($this->table)) { - $name = $name ?: $this->name; - $tableName = $this->prefix; - if ($name) { - $tableName .= Loader::parseName($name); - } - } else { - $tableName = $this->table; - } - return $tableName; - } - - /** - * 将SQL语句中的__TABLE_NAME__字符串替换成带前缀的表名(小写) - * @access public - * @param string $sql sql语句 - * @return string - */ - public function parseSqlTable($sql) - { - if (false !== strpos($sql, '__')) { - $prefix = $this->prefix; - $sql = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function ($match) use ($prefix) { - return $prefix . strtolower($match[1]); - }, $sql); - } - return $sql; - } - - /** - * 执行查询 返回数据集 - * @access public - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @param boolean $master 是否在主服务器读操作 - * @param bool|string $class 指定返回的数据集对象 - * @return mixed - * @throws BindParamException - * @throws PDOException - */ - public function query($sql, $bind = [], $master = false, $class = false) - { - return $this->connection->query($sql, $bind, $master, $class); - } - - /** - * 执行语句 - * @access public - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @return int - * @throws BindParamException - * @throws PDOException - */ - public function execute($sql, $bind = []) - { - return $this->connection->execute($sql, $bind); - } - - /** - * 获取最近插入的ID - * @access public - * @param string $sequence 自增序列名 - * @return string - */ - public function getLastInsID($sequence = null) - { - return $this->connection->getLastInsID($sequence); - } - - /** - * 获取最近一次查询的sql语句 - * @access public - * @return string - */ - public function getLastSql() - { - return $this->connection->getLastSql(); - } - - /** - * 执行数据库事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @return mixed - */ - public function transaction($callback) - { - return $this->connection->transaction($callback); - } - - /** - * 启动事务 - * @access public - * @return void - */ - public function startTrans() - { - $this->connection->startTrans(); - } - - /** - * 用于非自动提交状态下面的查询提交 - * @access public - * @return void - * @throws PDOException - */ - public function commit() - { - $this->connection->commit(); - } - - /** - * 事务回滚 - * @access public - * @return void - * @throws PDOException - */ - public function rollback() - { - $this->connection->rollback(); - } - - /** - * 批处理执行SQL语句 - * 批处理的指令都认为是execute操作 - * @access public - * @param array $sql SQL批处理指令 - * @return boolean - */ - public function batchQuery($sql = []) - { - return $this->connection->batchQuery($sql); - } - - /** - * 获取数据库的配置参数 - * @access public - * @param string $name 参数名称 - * @return boolean - */ - public function getConfig($name = '') - { - return $this->connection->getConfig($name); - } - - /** - * 得到分表的的数据表名 - * @access public - * @param array $data 操作的数据 - * @param string $field 分表依据的字段 - * @param array $rule 分表规则 - * @return string - */ - public function getPartitionTableName($data, $field, $rule = []) - { - // 对数据表进行分区 - if ($field && isset($data[$field])) { - $value = $data[$field]; - $type = $rule['type']; - switch ($type) { - case 'id': - // 按照id范围分表 - $step = $rule['expr']; - $seq = floor($value / $step) + 1; - break; - case 'year': - // 按照年份分表 - if (!is_numeric($value)) { - $value = strtotime($value); - } - $seq = date('Y', $value) - $rule['expr'] + 1; - break; - case 'mod': - // 按照id的模数分表 - $seq = ($value % $rule['num']) + 1; - break; - case 'md5': - // 按照md5的序列分表 - $seq = (ord(substr(md5($value), 0, 1)) % $rule['num']) + 1; - break; - default: - if (function_exists($type)) { - // 支持指定函数哈希 - $seq = (ord(substr($type($value), 0, 1)) % $rule['num']) + 1; - } else { - // 按照字段的首字母的值分表 - $seq = (ord($value{0}) % $rule['num']) + 1; - } - } - return $this->getTable() . '_' . $seq; - } else { - // 当设置的分表字段不在查询条件或者数据中 - // 进行联合查询,必须设定 partition['num'] - $tableName = []; - for ($i = 0; $i < $rule['num']; $i++) { - $tableName[] = 'SELECT * FROM ' . $this->getTable() . '_' . ($i + 1); - } - - $tableName = '( ' . implode(" UNION ", $tableName) . ') AS ' . $this->name; - return $tableName; - } - } - - /** - * 获取当前的builder实例对象 - * @access protected - * @return Builder - */ - protected function builder() - { - static $builder = []; - $driver = $this->builder; - if (!isset($builder[$driver])) { - $class = false !== strpos($driver, '\\') ? $driver : '\\think\\db\\builder\\' . ucfirst($driver); - $builder[$driver] = new $class($this->connection); - } - // 设置当前查询对象 - $builder[$driver]->setQuery($this); - return $builder[$driver]; - } - - /** - * 得到某个字段的值 - * @access public - * @param string $field 字段名 - * @param mixed $default 默认值 - * @return mixed - */ - public function value($field, $default = null) - { - $result = false; - if (!empty($this->options['cache'])) { - // 判断查询缓存 - $cache = $this->options['cache']; - if (empty($this->options['table'])) { - $this->options['table'] = $this->getTable(); - } - $key = is_string($cache['key']) ? $cache['key'] : md5($field . serialize($this->options)); - $result = Cache::get($key); - } - if (false === $result) { - if (isset($this->options['field'])) { - unset($this->options['field']); - } - $pdo = $this->field($field)->fetchPdo(true)->find(); - if (is_string($pdo)) { - // 返回SQL语句 - return $pdo; - } - $result = $pdo->fetchColumn(); - if (isset($cache)) { - // 缓存数据 - if (isset($cache['tag'])) { - Cache::tag($cache['tag'])->set($key, $result, $cache['expire']); - } else { - Cache::set($key, $result, $cache['expire']); - } - } - } else { - // 清空查询条件 - $this->options = []; - } - return false !== $result ? $result : $default; - } - - /** - * 得到某个列的数组 - * @access public - * @param string $field 字段名 多个字段用逗号分隔 - * @param string $key 索引 - * @return array - */ - public function column($field, $key = '') - { - $result = false; - if (!empty($this->options['cache'])) { - // 判断查询缓存 - $cache = $this->options['cache']; - if (empty($this->options['table'])) { - $this->options['table'] = $this->getTable(); - } - $guid = is_string($cache['key']) ? $cache['key'] : md5($field . serialize($this->options)); - $result = Cache::get($guid); - } - if (false === $result) { - if (isset($this->options['field'])) { - unset($this->options['field']); - } - if ($key && '*' != $field) { - $field = $key . ',' . $field; - } - $pdo = $this->field($field)->fetchPdo(true)->select(); - if (is_string($pdo)) { - // 返回SQL语句 - return $pdo; - } - if (1 == $pdo->columnCount()) { - $result = $pdo->fetchAll(PDO::FETCH_COLUMN); - } else { - $resultSet = $pdo->fetchAll(PDO::FETCH_ASSOC); - if ($resultSet) { - $fields = array_keys($resultSet[0]); - $count = count($fields); - $key1 = array_shift($fields); - $key2 = $fields ? array_shift($fields) : ''; - $key = $key ?: $key1; - foreach ($resultSet as $val) { - if ($count > 2) { - $result[$val[$key]] = $val; - } elseif (2 == $count) { - $result[$val[$key]] = $val[$key2]; - } elseif (1 == $count) { - $result[$val[$key]] = $val[$key1]; - } - } - } else { - $result = []; - } - } - if (isset($cache) && isset($guid)) { - // 缓存数据 - if (isset($cache['tag'])) { - Cache::tag($cache['tag'])->set($guid, $result, $cache['expire']); - } else { - Cache::set($guid, $result, $cache['expire']); - } - } - } else { - // 清空查询条件 - $this->options = []; - } - return $result; - } - - /** - * COUNT查询 - * @access public - * @param string $field 字段名 - * @return integer - */ - public function count($field = '*') - { - return (int) $this->value('COUNT(' . $field . ') AS tp_count', 0); - } - - /** - * SUM查询 - * @access public - * @param string $field 字段名 - * @return float|int - */ - public function sum($field = '*') - { - return $this->value('SUM(' . $field . ') AS tp_sum', 0) + 0; - } - - /** - * MIN查询 - * @access public - * @param string $field 字段名 - * @return mixed - */ - public function min($field = '*') - { - $value = $this->value('MIN(' . $field . ') AS tp_min', 0); - return is_numeric($value) ? $value + 0 : $value; - } - - /** - * MAX查询 - * @access public - * @param string $field 字段名 - * @return mixed - */ - public function max($field = '*') - { - $value = $this->value('MAX(' . $field . ') AS tp_max', 0); - return is_numeric($value) ? $value + 0 : $value; - } - - /** - * AVG查询 - * @access public - * @param string $field 字段名 - * @return float|int - */ - public function avg($field = '*') - { - return $this->value('AVG(' . $field . ') AS tp_avg', 0) + 0; - } - - /** - * 设置记录的某个字段值 - * 支持使用数据库字段和方法 - * @access public - * @param string|array $field 字段名 - * @param mixed $value 字段值 - * @return integer - */ - public function setField($field, $value = '') - { - if (is_array($field)) { - $data = $field; - } else { - $data[$field] = $value; - } - return $this->update($data); - } - - /** - * 字段值(延迟)增长 - * @access public - * @param string $field 字段名 - * @param integer $step 增长值 - * @param integer $lazyTime 延时时间(s) - * @return integer|true - * @throws Exception - */ - public function setInc($field, $step = 1, $lazyTime = 0) - { - $condition = !empty($this->options['where']) ? $this->options['where'] : []; - if (empty($condition)) { - // 没有条件不做任何更新 - throw new Exception('no data to update'); - } - if ($lazyTime > 0) { - // 延迟写入 - $guid = md5($this->getTable() . '_' . $field . '_' . serialize($condition)); - $step = $this->lazyWrite('inc', $guid, $step, $lazyTime); - if (false === $step) { - // 清空查询条件 - $this->options = []; - return true; - } - } - return $this->setField($field, ['exp', $field . '+' . $step]); - } - - /** - * 字段值(延迟)减少 - * @access public - * @param string $field 字段名 - * @param integer $step 减少值 - * @param integer $lazyTime 延时时间(s) - * @return integer|true - * @throws Exception - */ - public function setDec($field, $step = 1, $lazyTime = 0) - { - $condition = !empty($this->options['where']) ? $this->options['where'] : []; - if (empty($condition)) { - // 没有条件不做任何更新 - throw new Exception('no data to update'); - } - if ($lazyTime > 0) { - // 延迟写入 - $guid = md5($this->getTable() . '_' . $field . '_' . serialize($condition)); - $step = $this->lazyWrite('dec', $guid, $step, $lazyTime); - if (false === $step) { - // 清空查询条件 - $this->options = []; - return true; - } - } - return $this->setField($field, ['exp', $field . '-' . $step]); - } - - /** - * 延时更新检查 返回false表示需要延时 - * 否则返回实际写入的数值 - * @access protected - * @param string $type 自增或者自减 - * @param string $guid 写入标识 - * @param integer $step 写入步进值 - * @param integer $lazyTime 延时时间(s) - * @return false|integer - */ - protected function lazyWrite($type, $guid, $step, $lazyTime) - { - if (!Cache::has($guid . '_time')) { - // 计时开始 - Cache::set($guid . '_time', $_SERVER['REQUEST_TIME'], 0); - Cache::$type($guid, $step, 0); - } elseif ($_SERVER['REQUEST_TIME'] > Cache::get($guid . '_time') + $lazyTime) { - // 删除缓存 - $value = Cache::$type($guid, $step, 0); - Cache::rm($guid); - Cache::rm($guid . '_time'); - return 0 === $value ? false : $value; - } else { - // 更新缓存 - Cache::$type($guid, $step, 0); - } - return false; - } - - /** - * 查询SQL组装 join - * @access public - * @param mixed $join 关联的表名 - * @param mixed $condition 条件 - * @param string $type JOIN类型 - * @return $this - */ - public function join($join, $condition = null, $type = 'INNER') - { - if (empty($condition)) { - // 如果为组数,则循环调用join - foreach ($join as $key => $value) { - if (is_array($value) && 2 <= count($value)) { - $this->join($value[0], $value[1], isset($value[2]) ? $value[2] : $type); - } - } - } else { - $table = $this->getJoinTable($join); - - $this->options['join'][] = [$table, strtoupper($type), $condition]; - } - return $this; - } - - /** - * 获取Join表名及别名 支持 - * ['prefix_table或者子查询'=>'alias'] 'prefix_table alias' 'table alias' - * @access public - * @param array|string $join - * @return array|string - */ - protected function getJoinTable($join, &$alias = null) - { - // 传入的表名为数组 - if (is_array($join)) { - list($table, $alias) = each($join); - } else { - $join = trim($join); - if (false !== strpos($join, '(')) { - // 使用子查询 - $table = $join; - } else { - $prefix = $this->prefix; - if (strpos($join, ' ')) { - // 使用别名 - list($table, $alias) = explode(' ', $join); - } else { - $table = $join; - if (false === strpos($join, '.') && 0 !== strpos($join, '__')) { - $alias = $join; - } - } - if ($prefix && false === strpos($table, '.') && 0 !== strpos($table, $prefix) && 0 !== strpos($table, '__')) { - $table = $this->getTable($table); - } - } - } - if (isset($alias)) { - $table = [$table => $alias]; - $this->alias($table); - } - return $table; - } - - /** - * 查询SQL组装 union - * @access public - * @param mixed $union - * @param boolean $all - * @return $this - */ - public function union($union, $all = false) - { - $this->options['union']['type'] = $all ? 'UNION ALL' : 'UNION'; - - if (is_array($union)) { - $this->options['union'] = array_merge($this->options['union'], $union); - } else { - $this->options['union'][] = $union; - } - return $this; - } - - /** - * 指定查询字段 支持字段排除和指定数据表 - * @access public - * @param mixed $field - * @param boolean $except 是否排除 - * @param string $tableName 数据表名 - * @param string $prefix 字段前缀 - * @param string $alias 别名前缀 - * @return $this - */ - public function field($field, $except = false, $tableName = '', $prefix = '', $alias = '') - { - if (empty($field)) { - return $this; - } - if (is_string($field)) { - $field = array_map('trim', explode(',', $field)); - } - if (true === $field) { - // 获取全部字段 - $fields = $this->getTableInfo($tableName ?: (isset($this->options['table']) ? $this->options['table'] : ''), 'fields'); - $field = $fields ?: ['*']; - } elseif ($except) { - // 字段排除 - $fields = $this->getTableInfo($tableName ?: (isset($this->options['table']) ? $this->options['table'] : ''), 'fields'); - $field = $fields ? array_diff($fields, $field) : $field; - } - if ($tableName) { - // 添加统一的前缀 - $prefix = $prefix ?: $tableName; - foreach ($field as $key => $val) { - if (is_numeric($key)) { - $val = $prefix . '.' . $val . ($alias ? ' AS ' . $alias . $val : ''); - } - $field[$key] = $val; - } - } - - if (isset($this->options['field'])) { - $field = array_merge($this->options['field'], $field); - } - $this->options['field'] = array_unique($field); - return $this; - } - - /** - * 指定JOIN查询字段 - * @access public - * @param string|array $table 数据表 - * @param string|array $field 查询字段 - * @param string|array $on JOIN条件 - * @param string $type JOIN类型 - * @return $this - */ - public function view($join, $field = true, $on = null, $type = 'INNER') - { - $this->options['view'] = true; - if (is_array($join) && is_null($field)) { - foreach ($join as $key => $val) { - $this->view($key, $val[0], isset($val[1]) ? $val[1] : null, isset($val[2]) ? $val[2] : 'INNER'); - } - } else { - $fields = []; - $table = $this->getJoinTable($join, $alias); - - if (true === $field) { - $fields = $alias . '.*'; - } else { - if (is_string($field)) { - $field = explode(',', $field); - } - foreach ($field as $key => $val) { - if (is_numeric($key)) { - $fields[] = $alias . '.' . $val; - $this->options['map'][$val] = $alias . '.' . $val; - } else { - if (preg_match('/[,=\.\'\"\(\s]/', $key)) { - $name = $key; - } else { - $name = $alias . '.' . $key; - } - $fields[] = $name . ' AS ' . $val; - $this->options['map'][$val] = $name; - } - } - } - $this->field($fields); - if ($on) { - $this->join($table, $on, $type); - } else { - $this->table($table); - } - } - return $this; - } - - /** - * 设置分表规则 - * @access public - * @param array $data 操作的数据 - * @param string $field 分表依据的字段 - * @param array $rule 分表规则 - * @return $this - */ - public function partition($data, $field, $rule = []) - { - $this->options['table'] = $this->getPartitionTableName($data, $field, $rule); - return $this; - } - - /** - * 指定AND查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @return $this - */ - public function where($field, $op = null, $condition = null) - { - $param = func_get_args(); - array_shift($param); - $this->parseWhereExp('AND', $field, $op, $condition, $param); - return $this; - } - - /** - * 指定OR查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @return $this - */ - public function whereOr($field, $op = null, $condition = null) - { - $param = func_get_args(); - array_shift($param); - $this->parseWhereExp('OR', $field, $op, $condition, $param); - return $this; - } - - /** - * 指定XOR查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @return $this - */ - public function whereXor($field, $op = null, $condition = null) - { - $param = func_get_args(); - array_shift($param); - $this->parseWhereExp('XOR', $field, $op, $condition, $param); - return $this; - } - - /** - * 分析查询表达式 - * @access public - * @param string $logic 查询逻辑 and or xor - * @param string|array|\Closure $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @param array $param 查询参数 - * @return void - */ - protected function parseWhereExp($logic, $field, $op, $condition, $param = []) - { - if ($field instanceof \Closure) { - $this->options['where'][$logic][] = is_string($op) ? [$op, $field] : $field; - return; - } - - if (is_string($field) && !empty($this->options['via']) && !strpos($field, '.')) { - $field = $this->options['via'] . '.' . $field; - } - if (is_string($field) && preg_match('/[,=\>\<\'\"\(\s]/', $field)) { - $where[] = ['exp', $field]; - if (is_array($op)) { - // 参数绑定 - $this->bind($op); - } - } elseif (is_null($op) && is_null($condition)) { - if (is_array($field)) { - // 数组批量查询 - $where = $field; - } elseif ($field && is_string($field)) { - // 字符串查询 - $where[$field] = ['null', '']; - } - } elseif (is_array($op)) { - $where[$field] = $param; - } elseif (in_array(strtolower($op), ['null', 'notnull', 'not null'])) { - // null查询 - $where[$field] = [$op, '']; - } elseif (is_null($condition)) { - // 字段相等查询 - $where[$field] = ['eq', $op]; - } else { - $where[$field] = [$op, $condition]; - } - if (!empty($where)) { - if (!isset($this->options['where'][$logic])) { - $this->options['where'][$logic] = []; - } - $this->options['where'][$logic] = array_merge($this->options['where'][$logic], $where); - } - } - - /** - * 去除某个查询条件 - * @access public - * @param string $field 查询字段 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function removeWhereField($field, $logic = 'AND') - { - $logic = strtoupper($logic); - if (isset($this->options['where'][$logic][$field])) { - unset($this->options['where'][$logic][$field]); - } - return $this; - } - - /** - * 指定查询数量 - * @access public - * @param mixed $offset 起始位置 - * @param mixed $length 查询数量 - * @return $this - */ - public function limit($offset, $length = null) - { - if (is_null($length) && strpos($offset, ',')) { - list($offset, $length) = explode(',', $offset); - } - $this->options['limit'] = intval($offset) . ($length ? ',' . intval($length) : ''); - return $this; - } - - /** - * 指定分页 - * @access public - * @param mixed $page 页数 - * @param mixed $listRows 每页数量 - * @return $this - */ - public function page($page, $listRows = null) - { - if (is_null($listRows) && strpos($page, ',')) { - list($page, $listRows) = explode(',', $page); - } - $this->options['page'] = [intval($page), intval($listRows)]; - return $this; - } - - /** - * 分页查询 - * @param int|null $listRows 每页数量 - * @param int|bool $simple 简洁模式或者总记录数 - * @param array $config 配置参数 - * page:当前页, - * path:url路径, - * query:url额外参数, - * fragment:url锚点, - * var_page:分页变量, - * list_rows:每页数量 - * type:分页类名 - * @return \think\paginator\Collection - * @throws DbException - */ - public function paginate($listRows = null, $simple = false, $config = []) - { - if (is_int($simple)) { - $total = $simple; - $simple = false; - } - $config = array_merge(Config::get('paginate'), $config); - $listRows = $listRows ?: $config['list_rows']; - - /** @var Paginator $class */ - $class = false !== strpos($config['type'], '\\') ? $config['type'] : '\\think\\paginator\\driver\\' . ucwords($config['type']); - $page = isset($config['page']) ? (int) $config['page'] : call_user_func([ - $class, - 'getCurrentPage', - ], $config['var_page']); - - $page = $page < 1 ? 1 : $page; - - $config['path'] = isset($config['path']) ? $config['path'] : call_user_func([$class, 'getCurrentPath']); - - if (!isset($total) && !$simple) { - $options = $this->getOptions(); - if (isset($options['order'])) { - unset($this->options['order']); - } - $bind = $this->bind; - $total = $this->count(); - $results = $this->options($options)->bind($bind)->page($page, $listRows)->select(); - } elseif ($simple) { - $results = $this->limit(($page - 1) * $listRows, $listRows + 1)->select(); - $total = null; - } else { - $results = $this->page($page, $listRows)->select(); - } - return $class::make($results, $listRows, $page, $total, $simple, $config); - } - - /** - * 指定当前操作的数据表 - * @access public - * @param mixed $table 表名 - * @return $this - */ - public function table($table) - { - if (is_string($table)) { - if (strpos($table, ',')) { - $tables = explode(',', $table); - $table = []; - foreach ($tables as $item) { - list($item, $alias) = explode(' ', trim($item)); - if ($alias) { - $this->alias([$item => $alias]); - $table[$item] = $alias; - } else { - $table[] = $item; - } - } - } elseif (strpos($table, ' ')) { - list($table, $alias) = explode(' ', $table); - $table = [$table => $alias]; - $this->alias($table); - } - } else { - $tables = $table; - $table = []; - foreach ($tables as $key => $val) { - if (is_numeric($key)) { - $table[] = $val; - } else { - $this->alias([$key => $val]); - $table[$key] = $val; - } - } - } - $this->options['table'] = $table; - return $this; - } - - /** - * USING支持 用于多表删除 - * @access public - * @param mixed $using - * @return $this - */ - public function using($using) - { - $this->options['using'] = $using; - return $this; - } - - /** - * 指定排序 order('id','desc') 或者 order(['id'=>'desc','create_time'=>'desc']) - * @access public - * @param string|array $field 排序字段 - * @param string $order 排序 - * @return $this - */ - public function order($field, $order = null) - { - if (!empty($field)) { - if (is_string($field)) { - if (!empty($this->options['via'])) { - $field = $this->options['via'] . '.' . $field; - } - $field = empty($order) ? $field : [$field => $order]; - } elseif (!empty($this->options['via'])) { - foreach ($field as $key => $val) { - if (is_numeric($key)) { - $field[$key] = $this->options['via'] . '.' . $val; - } else { - $field[$this->options['via'] . '.' . $key] = $val; - unset($field[$key]); - } - } - } - $this->options['order'] = $field; - } - return $this; - } - - /** - * 查询缓存 - * @access public - * @param mixed $key 缓存key - * @param integer $expire 缓存有效期 - * @param string $tag 缓存标签 - * @return $this - */ - public function cache($key = true, $expire = null, $tag = null) - { - // 增加快捷调用方式 cache(10) 等同于 cache(true, 10) - if (is_numeric($key) && is_null($expire)) { - $expire = $key; - $key = true; - } - if (false !== $key) { - $this->options['cache'] = ['key' => $key, 'expire' => $expire, 'tag' => $tag]; - } - return $this; - } - - /** - * 指定group查询 - * @access public - * @param string $group GROUP - * @return $this - */ - public function group($group) - { - $this->options['group'] = $group; - return $this; - } - - /** - * 指定having查询 - * @access public - * @param string $having having - * @return $this - */ - public function having($having) - { - $this->options['having'] = $having; - return $this; - } - - /** - * 指定查询lock - * @access public - * @param boolean $lock 是否lock - * @return $this - */ - public function lock($lock = false) - { - $this->options['lock'] = $lock; - $this->options['master'] = true; - return $this; - } - - /** - * 指定distinct查询 - * @access public - * @param string $distinct 是否唯一 - * @return $this - */ - public function distinct($distinct) - { - $this->options['distinct'] = $distinct; - return $this; - } - - /** - * 指定数据表别名 - * @access public - * @param mixed $alias 数据表别名 - * @return $this - */ - public function alias($alias) - { - if (is_array($alias)) { - foreach ($alias as $key => $val) { - $this->options['alias'][$key] = $val; - } - } else { - if (isset($this->options['table'])) { - $table = is_array($this->options['table']) ? key($this->options['table']) : $this->options['table']; - if (false !== strpos($table, '__')) { - $table = $this->parseSqlTable($table); - } - } else { - $table = $this->getTable(); - } - - $this->options['alias'][$table] = $alias; - } - return $this; - } - - /** - * 指定强制索引 - * @access public - * @param string $force 索引名称 - * @return $this - */ - public function force($force) - { - $this->options['force'] = $force; - return $this; - } - - /** - * 查询注释 - * @access public - * @param string $comment 注释 - * @return $this - */ - public function comment($comment) - { - $this->options['comment'] = $comment; - return $this; - } - - /** - * 获取执行的SQL语句 - * @access public - * @param boolean $fetch 是否返回sql - * @return $this - */ - public function fetchSql($fetch = true) - { - $this->options['fetch_sql'] = $fetch; - return $this; - } - - /** - * 不主动获取数据集 - * @access public - * @param bool $pdo 是否返回 PDOStatement 对象 - * @return $this - */ - public function fetchPdo($pdo = true) - { - $this->options['fetch_class'] = $pdo; - return $this; - } - - /** - * 指定数据集返回对象 - * @access public - * @param string $class 指定返回的数据集对象类名 - * @return $this - */ - public function fetchClass($class) - { - $this->options['fetch_class'] = $class; - return $this; - } - - /** - * 设置从主服务器读取数据 - * @access public - * @return $this - */ - public function master() - { - $this->options['master'] = true; - return $this; - } - - /** - * 设置是否严格检查字段名 - * @access public - * @param bool $strict 是否严格检查字段 - * @return $this - */ - public function strict($strict = true) - { - $this->options['strict'] = $strict; - return $this; - } - - /** - * 设置查询数据不存在是否抛出异常 - * @access public - * @param bool $fail 数据不存在是否抛出异常 - * @return $this - */ - public function failException($fail = true) - { - $this->options['fail'] = $fail; - return $this; - } - - /** - * 设置自增序列名 - * @access public - * @param string $sequence 自增序列名 - * @return $this - */ - public function sequence($sequence = null) - { - $this->options['sequence'] = $sequence; - return $this; - } - - /** - * 指定数据表主键 - * @access public - * @param string $pk 主键 - * @return $this - */ - public function pk($pk) - { - $this->pk = $pk; - return $this; - } - - /** - * 查询日期或者时间 - * @access public - * @param string $field 日期字段名 - * @param string $op 比较运算符或者表达式 - * @param string|array $range 比较范围 - * @return $this - */ - public function whereTime($field, $op, $range = null) - { - if (is_null($range)) { - // 使用日期表达式 - $date = getdate(); - switch (strtolower($op)) { - case 'today': - case 'd': - $range = 'today'; - break; - case 'week': - case 'w': - $range = 'this week 00:00:00'; - break; - case 'month': - case 'm': - $range = mktime(0, 0, 0, $date['mon'], 1, $date['year']); - break; - case 'year': - case 'y': - $range = mktime(0, 0, 0, 1, 1, $date['year']); - break; - case 'yesterday': - $range = ['yesterday', 'today']; - break; - case 'last week': - $range = ['last week 00:00:00', 'this week 00:00:00']; - break; - case 'last month': - $range = [date('y-m-01', strtotime('-1 month')), mktime(0, 0, 0, $date['mon'], 1, $date['year'])]; - break; - case 'last year': - $range = [mktime(0, 0, 0, 1, 1, $date['year'] - 1), mktime(0, 0, 0, 1, 1, $date['year'])]; - break; - } - $op = is_array($range) ? 'between' : '>'; - } - $this->where($field, strtolower($op) . ' time', $range); - return $this; - } - - /** - * 获取数据表信息 - * @access public - * @param mixed $tableName 数据表名 留空自动获取 - * @param string $fetch 获取信息类型 包括 fields type bind pk - * @return mixed - */ - public function getTableInfo($tableName = '', $fetch = '') - { - if (!$tableName) { - $tableName = $this->getTable(); - } - if (is_array($tableName)) { - $tableName = key($tableName) ?: current($tableName); - } - - if (strpos($tableName, ',')) { - // 多表不获取字段信息 - return false; - } else { - $tableName = $this->parseSqlTable($tableName); - } - - list($guid) = explode(' ', $tableName); - if (!isset(self::$info[$guid])) { - if (!strpos($guid, '.')) { - $schema = $this->getConfig('database') . '.' . $guid; - } else { - $schema = $guid; - } - // 读取缓存 - if (is_file(RUNTIME_PATH . 'schema/' . $schema . '.php')) { - $info = include RUNTIME_PATH . 'schema/' . $schema . '.php'; - } else { - $info = $this->connection->getFields($guid); - } - $fields = array_keys($info); - $bind = $type = []; - foreach ($info as $key => $val) { - // 记录字段类型 - $type[$key] = $val['type']; - $bind[$key] = $this->getFieldBindType($val['type']); - if (!empty($val['primary'])) { - $pk[] = $key; - } - } - if (isset($pk)) { - // 设置主键 - $pk = count($pk) > 1 ? $pk : $pk[0]; - } else { - $pk = null; - } - self::$info[$guid] = ['fields' => $fields, 'type' => $type, 'bind' => $bind, 'pk' => $pk]; - } - return $fetch ? self::$info[$guid][$fetch] : self::$info[$guid]; - } - - /** - * 获取当前数据表的主键 - * @access public - * @param string|array $options 数据表名或者查询参数 - * @return string|array - */ - public function getPk($options = '') - { - if (!empty($this->pk)) { - $pk = $this->pk; - } else { - $pk = $this->getTableInfo(is_array($options) ? $options['table'] : $options, 'pk'); - } - return $pk; - } - - // 获取当前数据表字段信息 - public function getTableFields($options) - { - return $this->getTableInfo($options['table'], 'fields'); - } - - // 获取当前数据表字段类型 - public function getFieldsType($options) - { - return $this->getTableInfo($options['table'], 'type'); - } - - // 获取当前数据表绑定信息 - public function getFieldsBind($options) - { - $types = $this->getFieldsType($options); - $bind = []; - if ($types) { - foreach ($types as $key => $type) { - $bind[$key] = $this->getFieldBindType($type); - } - } - return $bind; - } - - /** - * 获取字段绑定类型 - * @access public - * @param string $type 字段类型 - * @return integer - */ - protected function getFieldBindType($type) - { - if (preg_match('/(int|double|float|decimal|real|numeric|serial)/is', $type)) { - $bind = PDO::PARAM_INT; - } elseif (preg_match('/bool/is', $type)) { - $bind = PDO::PARAM_BOOL; - } else { - $bind = PDO::PARAM_STR; - } - return $bind; - } - - /** - * 参数绑定 - * @access public - * @param mixed $key 参数名 - * @param mixed $value 绑定变量值 - * @param integer $type 绑定类型 - * @return $this - */ - public function bind($key, $value = false, $type = PDO::PARAM_STR) - { - if (is_array($key)) { - $this->bind = array_merge($this->bind, $key); - } else { - $this->bind[$key] = [$value, $type]; - } - return $this; - } - - /** - * 检测参数是否已经绑定 - * @access public - * @param string $key 参数名 - * @return bool - */ - public function isBind($key) - { - return isset($this->bind[$key]); - } - - /** - * 查询参数赋值 - * @access protected - * @param array $options 表达式参数 - * @return $this - */ - protected function options(array $options) - { - $this->options = $options; - return $this; - } - - /** - * 获取当前的查询参数 - * @access public - * @param string $name 参数名 - * @return mixed - */ - public function getOptions($name = '') - { - if ('' === $name) { - return $this->options; - } else { - return isset($this->options[$name]) ? $this->options[$name] : null; - } - } - - /** - * 设置关联查询JOIN预查询 - * @access public - * @param string|array $with 关联方法名称 - * @return $this - */ - public function with($with) - { - if (empty($with)) { - return $this; - } - - if (is_string($with)) { - $with = explode(',', $with); - } - - $i = 0; - $currentModel = $this->model; - - /** @var Model $class */ - $class = new $currentModel; - foreach ($with as $key => $relation) { - $closure = false; - if ($relation instanceof \Closure) { - // 支持闭包查询过滤关联条件 - $closure = $relation; - $relation = $key; - $with[$key] = $key; - } elseif (is_string($relation) && strpos($relation, '.')) { - $with[$key] = $relation; - list($relation, $subRelation) = explode('.', $relation, 2); - } - - /** @var Relation $model */ - $model = $class->$relation(); - $info = $model->getRelationInfo(); - if (in_array($info['type'], [Relation::HAS_ONE, Relation::BELONGS_TO])) { - if (0 == $i) { - $name = Loader::parseName(basename(str_replace('\\', '/', $currentModel))); - $table = $this->getTable(); - $alias = isset($info['alias'][$name]) ? $info['alias'][$name] : $name; - $this->table([$table => $alias]); - if (isset($this->options['field'])) { - $field = $this->options['field']; - unset($this->options['field']); - } else { - $field = true; - } - $this->field($field, false, $table, $alias); - } - // 预载入封装 - $joinTable = $model->getTable(); - $joinName = Loader::parseName(basename(str_replace('\\', '/', $info['model']))); - $joinAlias = isset($info['alias'][$joinName]) ? $info['alias'][$joinName] : $relation; - $this->via($joinAlias); - - if (Relation::HAS_ONE == $info['type']) { - $this->join($joinTable . ' ' . $joinAlias, $alias . '.' . $info['localKey'] . '=' . $joinAlias . '.' . $info['foreignKey'], $info['joinType']); - } else { - $this->join($joinTable . ' ' . $joinAlias, $alias . '.' . $info['foreignKey'] . '=' . $joinAlias . '.' . $info['localKey'], $info['joinType']); - } - - if ($closure) { - // 执行闭包查询 - call_user_func_array($closure, [ & $this]); - //指定获取关联的字段 - //需要在 回调中 调方法 withField 方法,如 - // $query->where(['id'=>1])->withField('id,name'); - if (!empty($this->options['with_field'])) { - $field = $this->options['with_field']; - unset($this->options['with_field']); - } - } elseif (isset($info['option']['field'])) { - $field = $info['option']['field']; - } - $this->field($field, false, $joinTable, $joinAlias, $relation . '__'); - $i++; - } elseif ($closure) { - $with[$key] = $closure; - } - } - $this->via(); - $this->options['with'] = $with; - return $this; - } - - /** - * 关联预加载中 获取关联指定字段值 - * example: - * Model::with(['relation' => function($query){ - * $query->withField("id,name"); - * }]) - * - * @param string | array $field 指定获取的字段 - * @return $this - */ - public function withField($field) - { - $this->options['with_field'] = $field; - return $this; - } - - /** - * 设置当前字段添加的表别名 - * @access public - * @param string $via - * @return $this - */ - public function via($via = '') - { - $this->options['via'] = $via; - return $this; - } - - /** - * 设置关联查询 - * @access public - * @param string $relation 关联名称 - * @return $this - */ - public function relation($relation) - { - $this->options['relation'] = $relation; - return $this; - } - - /** - * 把主键值转换为查询条件 支持复合主键 - * @access public - * @param array|string $data 主键数据 - * @param mixed $options 表达式参数 - * @return void - * @throws Exception - */ - protected function parsePkWhere($data, &$options) - { - $pk = $this->getPk($options); - // 获取当前数据表 - $table = is_array($options['table']) ? key($options['table']) : $options['table']; - if (!empty($options['alias'][$table])) { - $alias = $options['alias'][$table]; - } - if (is_string($pk)) { - $key = isset($alias) ? $alias . '.' . $pk : $pk; - // 根据主键查询 - if (is_array($data)) { - $where[$key] = isset($data[$pk]) ? $data[$pk] : ['in', $data]; - } else { - $where[$key] = strpos($data, ',') ? ['IN', $data] : $data; - } - } elseif (is_array($pk) && is_array($data) && !empty($data)) { - // 根据复合主键查询 - foreach ($pk as $key) { - if (isset($data[$key])) { - $attr = isset($alias) ? $alias . '.' . $key : $key; - $where[$attr] = $data[$key]; - } else { - throw new Exception('miss complex primary data'); - } - } - } - - if (!empty($where)) { - if (isset($options['where']['AND'])) { - $options['where']['AND'] = array_merge($options['where']['AND'], $where); - } else { - $options['where']['AND'] = $where; - } - } - return; - } - - /** - * 插入记录 - * @access public - * @param mixed $data 数据 - * @param boolean $replace 是否replace - * @param boolean $getLastInsID 返回自增主键 - * @param string $sequence 自增序列名 - * @return integer|string - */ - public function insert(array $data, $replace = false, $getLastInsID = false, $sequence = null) - { - // 分析查询表达式 - $options = $this->parseExpress(); - // 生成SQL语句 - $sql = $this->builder()->insert($data, $options, $replace); - // 获取参数绑定 - $bind = $this->getBind(); - if ($options['fetch_sql']) { - // 获取实际执行的SQL语句 - return $this->connection->getRealSql($sql, $bind); - } - - // 执行操作 - $result = $this->execute($sql, $bind); - if ($getLastInsID) { - $sequence = $sequence ?: (isset($options['sequence']) ? $options['sequence'] : null); - return $this->getLastInsID($sequence); - } - return $result; - } - - /** - * 插入记录并获取自增ID - * @access public - * @param mixed $data 数据 - * @param boolean $replace 是否replace - * @param string $sequence 自增序列名 - * @return integer|string - */ - public function insertGetId(array $data, $replace = false, $sequence = null) - { - return $this->insert($data, $replace, true, $sequence); - } - - /** - * 批量插入记录 - * @access public - * @param mixed $dataSet 数据集 - * @return integer|string - */ - public function insertAll(array $dataSet) - { - // 分析查询表达式 - $options = $this->parseExpress(); - if (!is_array(reset($dataSet))) { - return false; - } - // 生成SQL语句 - $sql = $this->builder()->insertAll($dataSet, $options); - // 获取参数绑定 - $bind = $this->getBind(); - if ($options['fetch_sql']) { - // 获取实际执行的SQL语句 - return $this->connection->getRealSql($sql, $bind); - } else { - // 执行操作 - return $this->execute($sql, $bind); - } - } - - /** - * 通过Select方式插入记录 - * @access public - * @param string $fields 要插入的数据表字段名 - * @param string $table 要插入的数据表名 - * @return integer|string - * @throws PDOException - */ - public function selectInsert($fields, $table) - { - // 分析查询表达式 - $options = $this->parseExpress(); - // 生成SQL语句 - $table = $this->parseSqlTable($table); - $sql = $this->builder()->selectInsert($fields, $table, $options); - // 获取参数绑定 - $bind = $this->getBind(); - if ($options['fetch_sql']) { - // 获取实际执行的SQL语句 - return $this->connection->getRealSql($sql, $bind); - } else { - // 执行操作 - return $this->execute($sql, $bind); - } - } - - /** - * 更新记录 - * @access public - * @param mixed $data 数据 - * @return integer|string - * @throws Exception - * @throws PDOException - */ - public function update(array $data) - { - $options = $this->parseExpress(); - $pk = $this->getPk($options); - if (isset($options['cache']) && is_string($options['cache'])) { - $key = $options['cache']; - } - - if (empty($options['where'])) { - // 如果存在主键数据 则自动作为更新条件 - if (is_string($pk) && isset($data[$pk])) { - $where[$pk] = $data[$pk]; - if (!isset($key)) { - $key = 'think:' . $options['table'] . '|' . $data[$pk]; - } - unset($data[$pk]); - } elseif (is_array($pk)) { - // 增加复合主键支持 - foreach ($pk as $field) { - if (isset($data[$field])) { - $where[$field] = $data[$field]; - } else { - // 如果缺少复合主键数据则不执行 - throw new Exception('miss complex primary data'); - } - unset($data[$field]); - } - } - if (!isset($where)) { - // 如果没有任何更新条件则不执行 - throw new Exception('miss update condition'); - } else { - $options['where']['AND'] = $where; - } - } elseif (is_string($pk) && isset($options['where']['AND'][$pk]) && is_scalar($options['where']['AND'][$pk])) { - $key = 'think:' . $options['table'] . '|' . $options['where']['AND'][$pk]; - } - // 生成UPDATE SQL语句 - $sql = $this->builder()->update($data, $options); - // 获取参数绑定 - $bind = $this->getBind(); - if ($options['fetch_sql']) { - // 获取实际执行的SQL语句 - return $this->connection->getRealSql($sql, $bind); - } else { - // 检测缓存 - if (isset($key) && Cache::get($key)) { - // 删除缓存 - Cache::rm($key); - } - // 执行操作 - return '' == $sql ? 0 : $this->execute($sql, $bind); - } - } - - /** - * 查找记录 - * @access public - * @param array|string|Query|\Closure $data - * @return Collection|false|\PDOStatement|string - * @throws DbException - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - public function select($data = null) - { - if ($data instanceof Query) { - return $data->select(); - } elseif ($data instanceof \Closure) { - call_user_func_array($data, [ & $this]); - $data = null; - } - // 分析查询表达式 - $options = $this->parseExpress(); - - if (false === $data) { - // 用于子查询 不查询只返回SQL - $options['fetch_sql'] = true; - } elseif (!is_null($data)) { - // 主键条件分析 - $this->parsePkWhere($data, $options); - } - - $resultSet = false; - if (empty($options['fetch_sql']) && !empty($options['cache'])) { - // 判断查询缓存 - $cache = $options['cache']; - unset($options['cache']); - $key = is_string($cache['key']) ? $cache['key'] : md5(serialize($options)); - $resultSet = Cache::get($key); - } - if (!$resultSet) { - // 生成查询SQL - $sql = $this->builder()->select($options); - // 获取参数绑定 - $bind = $this->getBind(); - if ($options['fetch_sql']) { - // 获取实际执行的SQL语句 - return $this->connection->getRealSql($sql, $bind); - } - // 执行查询操作 - $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_class']); - - if ($resultSet instanceof \PDOStatement) { - // 返回PDOStatement对象 - return $resultSet; - } - - if (isset($cache)) { - // 缓存数据集 - if (isset($cache['tag'])) { - Cache::tag($cache['tag'])->set($key, $resultSet, $cache['expire']); - } else { - Cache::set($key, $resultSet, $cache['expire']); - } - } - } - - // 返回结果处理 - if (count($resultSet) > 0) { - // 数据列表读取后的处理 - if (!empty($this->model)) { - // 生成模型对象 - $model = $this->model; - foreach ($resultSet as $key => $result) { - /** @var Model $result */ - $result = new $model($result); - $result->isUpdate(true); - // 关联查询 - if (!empty($options['relation'])) { - $result->relationQuery($options['relation']); - } - $resultSet[$key] = $result; - } - if (!empty($options['with']) && $result instanceof Model) { - // 预载入 - $resultSet = $result->eagerlyResultSet($resultSet, $options['with'], is_object($resultSet) ? get_class($resultSet) : ''); - } - } - } elseif (!empty($options['fail'])) { - $this->throwNotFound($options); - } - return $resultSet; - } - - /** - * 查找单条记录 - * @access public - * @param array|string|Query|\Closure $data - * @return array|false|\PDOStatement|string|Model - * @throws DbException - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - public function find($data = null) - { - if ($data instanceof Query) { - return $data->find(); - } elseif ($data instanceof \Closure) { - call_user_func_array($data, [ & $this]); - $data = null; - } - // 分析查询表达式 - $options = $this->parseExpress(); - - if (!is_null($data)) { - // AR模式分析主键条件 - $this->parsePkWhere($data, $options); - } - - $options['limit'] = 1; - $result = false; - if (empty($options['fetch_sql']) && !empty($options['cache'])) { - // 判断查询缓存 - $cache = $options['cache']; - if (true === $cache['key'] && !is_null($data) && !is_array($data)) { - $key = 'think:' . (is_array($options['table']) ? key($options['table']) : $options['table']) . '|' . $data; - } else { - $key = is_string($cache['key']) ? $cache['key'] : md5(serialize($options)); - } - $result = Cache::get($key); - } - if (!$result) { - // 生成查询SQL - $sql = $this->builder()->select($options); - // 获取参数绑定 - $bind = $this->getBind(); - if ($options['fetch_sql']) { - // 获取实际执行的SQL语句 - return $this->connection->getRealSql($sql, $bind); - } - // 执行查询 - $result = $this->query($sql, $bind, $options['master'], $options['fetch_class']); - - if ($result instanceof \PDOStatement) { - // 返回PDOStatement对象 - return $result; - } - - if (isset($cache)) { - // 缓存数据 - if (isset($cache['tag'])) { - Cache::tag($cache['tag'])->set($key, $result, $cache['expire']); - } else { - Cache::set($key, $result, $cache['expire']); - } - } - } - - // 数据处理 - if (!empty($result[0])) { - $data = $result[0]; - if (!empty($this->model)) { - // 返回模型对象 - $model = $this->model; - $data = new $model($data); - $data->isUpdate(true, isset($options['where']['AND']) ? $options['where']['AND'] : null); - // 关联查询 - if (!empty($options['relation'])) { - $data->relationQuery($options['relation']); - } - if (!empty($options['with'])) { - // 预载入 - $data->eagerlyResult($data, $options['with'], is_object($result) ? get_class($result) : ''); - } - } - } elseif (!empty($options['fail'])) { - $this->throwNotFound($options); - } else { - $data = null; - } - return $data; - } - - /** - * 查询失败 抛出异常 - * @access public - * @param array $options 查询参数 - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - protected function throwNotFound($options = []) - { - if (!empty($this->model)) { - throw new ModelNotFoundException('model data Not Found:' . $this->model, $this->model, $options); - } else { - $table = is_array($options['table']) ? key($options['table']) : $options['table']; - throw new DataNotFoundException('table data not Found:' . $table, $table, $options); - } - } - - /** - * 查找多条记录 如果不存在则抛出异常 - * @access public - * @param array|string|Query|\Closure $data - * @return array|\PDOStatement|string|Model - * @throws DbException - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - public function selectOrFail($data = null) - { - return $this->failException(true)->select($data); - } - - /** - * 查找单条记录 如果不存在则抛出异常 - * @access public - * @param array|string|Query|\Closure $data - * @return array|\PDOStatement|string|Model - * @throws DbException - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - public function findOrFail($data = null) - { - return $this->failException(true)->find($data); - } - - /** - * 分批数据返回处理 - * @access public - * @param integer $count 每次处理的数据数量 - * @param callable $callback 处理回调方法 - * @param string $column 分批处理的字段名 - * @return boolean - */ - public function chunk($count, $callback, $column = null) - { - $options = $this->getOptions(); - if (isset($options['table'])) { - $table = is_array($options['table']) ? key($options['table']) : $options['table']; - } else { - $table = ''; - } - $column = $column ?: $this->getPk($table); - $bind = $this->bind; - $resultSet = $this->limit($count)->order($column, 'asc')->select(); - - while (!empty($resultSet)) { - if (false === call_user_func($callback, $resultSet)) { - return false; - } - $end = end($resultSet); - $lastId = is_array($end) ? $end[$column] : $end->$column; - $resultSet = $this->options($options) - ->limit($count) - ->bind($bind) - ->where($column, '>', $lastId) - ->order($column, 'asc') - ->select(); - } - return true; - } - - /** - * 获取绑定的参数 并清空 - * @access public - * @return array - */ - public function getBind() - { - $bind = $this->bind; - $this->bind = []; - return $bind; - } - - /** - * 创建子查询SQL - * @access public - * @param bool $sub - * @return string - * @throws DbException - */ - public function buildSql($sub = true) - { - return $sub ? '( ' . $this->select(false) . ' )' : $this->select(false); - } - - /** - * 删除记录 - * @access public - * @param mixed $data 表达式 true 表示强制删除 - * @return int - * @throws Exception - * @throws PDOException - */ - public function delete($data = null) - { - // 分析查询表达式 - $options = $this->parseExpress(); - if (isset($options['cache']) && is_string($options['cache'])) { - $key = $options['cache']; - } - - if (!is_null($data) && true !== $data) { - if (!isset($key) && !is_array($data)) { - // 缓存标识 - $key = 'think:' . $options['table'] . '|' . $data; - } - // AR模式分析主键条件 - $this->parsePkWhere($data, $options); - } - - if (true !== $data && empty($options['where'])) { - // 如果条件为空 不进行删除操作 除非设置 1=1 - throw new Exception('delete without condition'); - } - // 生成删除SQL语句 - $sql = $this->builder()->delete($options); - // 获取参数绑定 - $bind = $this->getBind(); - if ($options['fetch_sql']) { - // 获取实际执行的SQL语句 - return $this->connection->getRealSql($sql, $bind); - } - - // 检测缓存 - if (isset($key) && Cache::get($key)) { - // 删除缓存 - Cache::rm($key); - } - // 执行操作 - return $this->execute($sql, $bind); - } - - /** - * 分析表达式(可用于查询或者写入操作) - * @access protected - * @return array - */ - protected function parseExpress() - { - $options = $this->options; - - // 获取数据表 - if (empty($options['table'])) { - $options['table'] = $this->getTable(); - } - - if (!isset($options['where'])) { - $options['where'] = []; - } elseif (isset($options['view'])) { - // 视图查询条件处理 - foreach (['AND', 'OR'] as $logic) { - if (isset($options['where'][$logic])) { - foreach ($options['where'][$logic] as $key => $val) { - if (array_key_exists($key, $options['map'])) { - $options['where'][$logic][$options['map'][$key]] = $val; - unset($options['where'][$logic][$key]); - } - } - } - } - - if (isset($options['order'])) { - // 视图查询排序处理 - if (is_string($options['order'])) { - $options['order'] = explode(',', $options['order']); - } - foreach ($options['order'] as $key => $val) { - if (is_numeric($key)) { - if (strpos($val, ' ')) { - list($field, $sort) = explode(' ', $val); - if (array_key_exists($field, $options['map'])) { - $options['order'][$options['map'][$field]] = $sort; - unset($options['order'][$key]); - } - } elseif (array_key_exists($val, $options['map'])) { - $options['order'][$options['map'][$val]] = 'asc'; - unset($options['order'][$key]); - } - } elseif (array_key_exists($key, $options['map'])) { - $options['order'][$options['map'][$key]] = $val; - unset($options['order'][$key]); - } - } - } - } - - if (!isset($options['field'])) { - $options['field'] = '*'; - } - - if (!isset($options['strict'])) { - $options['strict'] = $this->getConfig('fields_strict'); - } - - foreach (['master', 'lock', 'fetch_class', 'fetch_sql', 'distinct'] as $name) { - if (!isset($options[$name])) { - $options[$name] = false; - } - } - - foreach (['join', 'union', 'group', 'having', 'limit', 'order', 'force', 'comment'] as $name) { - if (!isset($options[$name])) { - $options[$name] = ''; - } - } - - if (isset($options['page'])) { - // 根据页数计算limit - list($page, $listRows) = $options['page']; - $page = $page > 0 ? $page : 1; - $listRows = $listRows > 0 ? $listRows : (is_numeric($options['limit']) ? $options['limit'] : 20); - $offset = $listRows * ($page - 1); - $options['limit'] = $offset . ',' . $listRows; - } - - $this->options = []; - return $options; - } - -} diff --git a/thinkphp/library/think/db/builder/Mysql.php b/thinkphp/library/think/db/builder/Mysql.php deleted file mode 100755 index a3e223e..0000000 --- a/thinkphp/library/think/db/builder/Mysql.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\builder; - -use think\db\Builder; - -/** - * mysql数据库驱动 - */ -class Mysql extends Builder -{ - protected $updateSql = 'UPDATE %TABLE% %JOIN% SET %SET% %WHERE% %ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * 字段和表名处理 - * @access protected - * @param string $key - * @param array $options - * @return string - */ - protected function parseKey($key, $options = []) - { - $key = trim($key); - if (strpos($key, '$.') && false === strpos($key, '(')) { - // JSON字段支持 - list($field, $name) = explode('$.', $key); - $key = 'json_extract(' . $field . ', \'$.' . $name . '\')'; - } elseif (strpos($key, '.') && !preg_match('/[,\'\"\(\)`\s]/', $key)) { - list($table, $key) = explode('.', $key, 2); - if (isset($options['alias'][$table])) { - $table = $options['alias'][$table]; - } - } - if (!preg_match('/[,\'\"\*\(\)`.\s]/', $key)) { - $key = '`' . $key . '`'; - } - if (isset($table)) { - $key = '`' . $table . '`.' . $key; - } - return $key; - } - - /** - * 随机排序 - * @access protected - * @return string - */ - protected function parseRand() - { - return 'rand()'; - } - -} diff --git a/thinkphp/library/think/db/builder/Pgsql.php b/thinkphp/library/think/db/builder/Pgsql.php deleted file mode 100755 index e6e7dff..0000000 --- a/thinkphp/library/think/db/builder/Pgsql.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\builder; - -use think\db\Builder; - -/** - * Pgsql数据库驱动 - */ -class Pgsql extends Builder -{ - - /** - * limit分析 - * @access protected - * @param mixed $limit - * @return string - */ - public function parseLimit($limit) - { - $limitStr = ''; - if (!empty($limit)) { - $limit = explode(',', $limit); - if (count($limit) > 1) { - $limitStr .= ' LIMIT ' . $limit[1] . ' OFFSET ' . $limit[0] . ' '; - } else { - $limitStr .= ' LIMIT ' . $limit[0] . ' '; - } - } - return $limitStr; - } - - /** - * 字段和表名处理 - * @access protected - * @param string $key - * @param array $options - * @return string - */ - protected function parseKey($key, $options = []) - { - $key = trim($key); - if (strpos($key, '$.') && false === strpos($key, '(')) { - // JSON字段支持 - list($field, $name) = explode('$.', $key); - $key = $field . '->>\'' . $name . '\''; - } elseif (strpos($key, '.')) { - list($table, $key) = explode('.', $key, 2); - if (isset($options['alias'][$table])) { - $table = $options['alias'][$table]; - } - } - if (isset($table)) { - $key = $table . '.' . $key; - } - return $key; - } - - /** - * 随机排序 - * @access protected - * @return string - */ - protected function parseRand() - { - return 'RANDOM()'; - } - -} diff --git a/thinkphp/library/think/db/builder/Sqlite.php b/thinkphp/library/think/db/builder/Sqlite.php deleted file mode 100755 index c9f5502..0000000 --- a/thinkphp/library/think/db/builder/Sqlite.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\builder; - -use think\db\Builder; - -/** - * Sqlite数据库驱动 - */ -class Sqlite extends Builder -{ - - /** - * limit - * @access public - * @return string - */ - public function parseLimit($limit) - { - $limitStr = ''; - if (!empty($limit)) { - $limit = explode(',', $limit); - if (count($limit) > 1) { - $limitStr .= ' LIMIT ' . $limit[1] . ' OFFSET ' . $limit[0] . ' '; - } else { - $limitStr .= ' LIMIT ' . $limit[0] . ' '; - } - } - return $limitStr; - } - - /** - * 随机排序 - * @access protected - * @return string - */ - protected function parseRand() - { - return 'RANDOM()'; - } - - /** - * 字段和表名处理 - * @access protected - * @param string $key - * @param array $options - * @return string - */ - protected function parseKey($key, $options = []) - { - $key = trim($key); - if (strpos($key, '.')) { - list($table, $key) = explode('.', $key, 2); - if (isset($options['alias'][$table])) { - $table = $options['alias'][$table]; - } - } - if (isset($table)) { - $key = $table . '.' . $key; - } - return $key; - } -} diff --git a/thinkphp/library/think/db/builder/Sqlsrv.php b/thinkphp/library/think/db/builder/Sqlsrv.php deleted file mode 100755 index d2f418f..0000000 --- a/thinkphp/library/think/db/builder/Sqlsrv.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\builder; - -use think\db\Builder; - -/** - * Sqlsrv数据库驱动 - */ -class Sqlsrv extends Builder -{ - protected $selectSql = 'SELECT T1.* FROM (SELECT thinkphp.*, ROW_NUMBER() OVER (%ORDER%) AS ROW_NUMBER FROM (SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%) AS thinkphp) AS T1 %LIMIT%%COMMENT%'; - protected $selectInsertSql = 'SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%'; - protected $updateSql = 'UPDATE %TABLE% SET %SET% FROM %TABLE% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%'; - protected $deleteSql = 'DELETE FROM %TABLE% %USING% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%'; - - /** - * order分析 - * @access protected - * @param mixed $order - * @param array $options - * @return string - */ - protected function parseOrder($order, $options = []) - { - if (is_array($order)) { - $array = []; - foreach ($order as $key => $val) { - if (is_numeric($key)) { - if (false === strpos($val, '(')) { - $array[] = $this->parseKey($val, $options); - } elseif ('[rand]' == $val) { - $array[] = $this->parseRand(); - } - } else { - $sort = in_array(strtolower(trim($val)), ['asc', 'desc']) ? ' ' . $val : ''; - $array[] = $this->parseKey($key, $options) . ' ' . $sort; - } - } - $order = implode(',', $array); - } - return !empty($order) ? ' ORDER BY ' . $order : ' ORDER BY rand()'; - } - - /** - * 随机排序 - * @access protected - * @return string - */ - protected function parseRand() - { - return 'rand()'; - } - - /** - * 字段和表名处理 - * @access protected - * @param string $key - * @param array $options - * @return string - */ - protected function parseKey($key, $options = []) - { - $key = trim($key); - if (strpos($key, '.') && !preg_match('/[,\'\"\(\)\[\s]/', $key)) { - list($table, $key) = explode('.', $key, 2); - if (isset($options['alias'][$table])) { - $table = $options['alias'][$table]; - } - } - if (!is_numeric($key) && !preg_match('/[,\'\"\*\(\)\[.\s]/', $key)) { - $key = '[' . $key . ']'; - } - if (isset($table)) { - $key = '[' . $table . '].' . $key; - } - return $key; - } - - /** - * limit - * @access protected - * @param mixed $limit - * @return string - */ - protected function parseLimit($limit) - { - if (empty($limit)) { - return ''; - } - - $limit = explode(',', $limit); - if (count($limit) > 1) { - $limitStr = '(T1.ROW_NUMBER BETWEEN ' . $limit[0] . ' + 1 AND ' . $limit[0] . ' + ' . $limit[1] . ')'; - } else { - $limitStr = '(T1.ROW_NUMBER BETWEEN 1 AND ' . $limit[0] . ")"; - } - return 'WHERE ' . $limitStr; - } - - public function selectInsert($fields, $table, $options) - { - $this->selectSql = $this->selectInsertSql; - return parent::selectInsert($fields, $table, $options); - } - -} diff --git a/thinkphp/library/think/db/connector/Mysql.php b/thinkphp/library/think/db/connector/Mysql.php deleted file mode 100755 index 47b069f..0000000 --- a/thinkphp/library/think/db/connector/Mysql.php +++ /dev/null @@ -1,127 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\Connection; -use think\Log; - -/** - * mysql数据库驱动 - */ -class Mysql extends Connection -{ - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn($config) - { - $dsn = 'mysql:dbname=' . $config['database'] . ';host=' . $config['hostname']; - if (!empty($config['hostport'])) { - $dsn .= ';port=' . $config['hostport']; - } elseif (!empty($config['socket'])) { - $dsn .= ';unix_socket=' . $config['socket']; - } - if (!empty($config['charset'])) { - $dsn .= ';charset=' . $config['charset']; - } - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields($tableName) - { - $this->initConnect(true); - list($tableName) = explode(' ', $tableName); - if (strpos($tableName, '.')) { - $tableName = str_replace('.', '`.`', $tableName); - } - $sql = 'SHOW COLUMNS FROM `' . $tableName . '`'; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - if ($result) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - $info[$val['field']] = [ - 'name' => $val['field'], - 'type' => $val['type'], - 'notnull' => (bool) ('' === $val['null']), // not null is empty, null is yes - 'default' => $val['default'], - 'primary' => (strtolower($val['key']) == 'pri'), - 'autoinc' => (strtolower($val['extra']) == 'auto_increment'), - ]; - } - } - return $this->fieldCase($info); - } - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables($dbName = '') - { - $this->initConnect(true); - $sql = !empty($dbName) ? 'SHOW TABLES FROM ' . $dbName : 'SHOW TABLES '; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - return $info; - } - - /** - * SQL性能分析 - * @access protected - * @param string $sql - * @return array - */ - protected function getExplain($sql) - { - $pdo = $this->linkID->query("EXPLAIN " . $sql); - $result = $pdo->fetch(PDO::FETCH_ASSOC); - $result = array_change_key_case($result); - if (isset($result['extra'])) { - if (strpos($result['extra'], 'filesort') || strpos($result['extra'], 'temporary')) { - Log::record('SQL:' . $this->queryStr . '[' . $result['extra'] . ']', 'warn'); - } - } - return $result; - } - - protected function supportSavepoint() - { - return true; - } -} diff --git a/thinkphp/library/think/db/connector/Pgsql.php b/thinkphp/library/think/db/connector/Pgsql.php deleted file mode 100755 index e9866cf..0000000 --- a/thinkphp/library/think/db/connector/Pgsql.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\Connection; - -/** - * Pgsql数据库驱动 - */ -class Pgsql extends Connection -{ - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn($config) - { - $dsn = 'pgsql:dbname=' . $config['database'] . ';host=' . $config['hostname']; - if (!empty($config['hostport'])) { - $dsn .= ';port=' . $config['hostport']; - } - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields($tableName) - { - $this->initConnect(true); - list($tableName) = explode(' ', $tableName); - $sql = 'select fields_name as "field",fields_type as "type",fields_not_null as "null",fields_key_name as "key",fields_default as "default",fields_default as "extra" from table_msg(\'' . $tableName . '\');'; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - if ($result) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - $info[$val['field']] = [ - 'name' => $val['field'], - 'type' => $val['type'], - 'notnull' => (bool) ('' !== $val['null']), - 'default' => $val['default'], - 'primary' => !empty($val['key']), - 'autoinc' => (0 === strpos($val['extra'], 'nextval(')), - ]; - } - } - return $this->fieldCase($info); - } - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables($dbName = '') - { - $this->initConnect(true); - $sql = "select tablename as Tables_in_test from pg_tables where schemaname ='public'"; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - return $info; - } - - /** - * SQL性能分析 - * @access protected - * @param string $sql - * @return array - */ - protected function getExplain($sql) - { - return []; - } - - protected function supportSavepoint() - { - return true; - } -} diff --git a/thinkphp/library/think/db/connector/Sqlite.php b/thinkphp/library/think/db/connector/Sqlite.php deleted file mode 100755 index 95b023e..0000000 --- a/thinkphp/library/think/db/connector/Sqlite.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\Connection; - -/** - * Sqlite数据库驱动 - */ -class Sqlite extends Connection -{ - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn($config) - { - $dsn = 'sqlite:' . $config['database']; - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields($tableName) - { - $this->initConnect(true); - list($tableName) = explode(' ', $tableName); - $sql = 'PRAGMA table_info( ' . $tableName . ' )'; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - if ($result) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - $info[$val['name']] = [ - 'name' => $val['name'], - 'type' => $val['type'], - 'notnull' => 1 === $val['notnull'], - 'default' => $val['dflt_value'], - 'primary' => '1' == $val['pk'], - 'autoinc' => '1' == $val['pk'], - ]; - } - } - return $this->fieldCase($info); - } - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables($dbName = '') - { - $this->initConnect(true); - $sql = "SELECT name FROM sqlite_master WHERE type='table' " - . "UNION ALL SELECT name FROM sqlite_temp_master " - . "WHERE type='table' ORDER BY name"; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - return $info; - } - - /** - * SQL性能分析 - * @access protected - * @param string $sql - * @return array - */ - protected function getExplain($sql) - { - return []; - } - - protected function supportSavepoint() - { - return true; - } -} diff --git a/thinkphp/library/think/db/connector/Sqlsrv.php b/thinkphp/library/think/db/connector/Sqlsrv.php deleted file mode 100755 index 1814805..0000000 --- a/thinkphp/library/think/db/connector/Sqlsrv.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\Connection; - -/** - * Sqlsrv数据库驱动 - */ -class Sqlsrv extends Connection -{ - // PDO连接参数 - protected $params = [ - PDO::ATTR_CASE => PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_STRINGIFY_FETCHES => false, - ]; - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn($config) - { - $dsn = 'sqlsrv:Database=' . $config['database'] . ';Server=' . $config['hostname']; - if (!empty($config['hostport'])) { - $dsn .= ',' . $config['hostport']; - } - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields($tableName) - { - $this->initConnect(true); - list($tableName) = explode(' ', $tableName); - $sql = "SELECT column_name, data_type, column_default, is_nullable - FROM information_schema.tables AS t - JOIN information_schema.columns AS c - ON t.table_catalog = c.table_catalog - AND t.table_schema = c.table_schema - AND t.table_name = c.table_name - WHERE t.table_name = '$tableName'"; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - if ($result) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - $info[$val['column_name']] = [ - 'name' => $val['column_name'], - 'type' => $val['data_type'], - 'notnull' => (bool) ('' === $val['is_nullable']), // not null is empty, null is yes - 'default' => $val['column_default'], - 'primary' => false, - 'autoinc' => false, - ]; - } - } - $sql = "SELECT column_name FROM information_schema.key_column_usage WHERE table_name='$tableName'"; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetch(PDO::FETCH_ASSOC); - if ($result) { - $info[$result['column_name']]['primary'] = true; - } - return $this->fieldCase($info); - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables($dbName = '') - { - $this->initConnect(true); - $sql = "SELECT TABLE_NAME - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_TYPE = 'BASE TABLE' - "; - // 调试开始 - $this->debug(true); - $pdo = $this->linkID->query($sql); - // 调试结束 - $this->debug(false, $sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - return $info; - } - - /** - * SQL性能分析 - * @access protected - * @param string $sql - * @return array - */ - protected function getExplain($sql) - { - return []; - } -} diff --git a/thinkphp/library/think/db/connector/pgsql.sql b/thinkphp/library/think/db/connector/pgsql.sql deleted file mode 100755 index e1a09a3..0000000 --- a/thinkphp/library/think/db/connector/pgsql.sql +++ /dev/null @@ -1,117 +0,0 @@ -CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varchar AS -$BODY$ -DECLARE - v_type varchar; -BEGIN - IF a_type='int8' THEN - v_type:='bigint'; - ELSIF a_type='int4' THEN - v_type:='integer'; - ELSIF a_type='int2' THEN - v_type:='smallint'; - ELSIF a_type='bpchar' THEN - v_type:='char'; - ELSE - v_type:=a_type; - END IF; - RETURN v_type; -END; -$BODY$ -LANGUAGE PLPGSQL; - -CREATE TYPE "public"."tablestruct" AS ( - "fields_key_name" varchar(100), - "fields_name" VARCHAR(200), - "fields_type" VARCHAR(20), - "fields_length" BIGINT, - "fields_not_null" VARCHAR(10), - "fields_default" VARCHAR(500), - "fields_comment" VARCHAR(1000) -); - -CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS -$body$ -DECLARE - v_ret tablestruct; - v_oid oid; - v_sql varchar; - v_rec RECORD; - v_key varchar; -BEGIN - SELECT - pg_class.oid INTO v_oid - FROM - pg_class - INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid AND lower(pg_namespace.nspname) = a_schema_name) - WHERE - pg_class.relname=a_table_name; - IF NOT FOUND THEN - RETURN; - END IF; - - v_sql=' - SELECT - pg_attribute.attname AS fields_name, - pg_attribute.attnum AS fields_index, - pgsql_type(pg_type.typname::varchar) AS fields_type, - pg_attribute.atttypmod-4 as fields_length, - CASE WHEN pg_attribute.attnotnull THEN ''not null'' - ELSE '''' - END AS fields_not_null, - pg_attrdef.adsrc AS fields_default, - pg_description.description AS fields_comment - FROM - pg_attribute - INNER JOIN pg_class ON pg_attribute.attrelid = pg_class.oid - INNER JOIN pg_type ON pg_attribute.atttypid = pg_type.oid - LEFT OUTER JOIN pg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum - LEFT OUTER JOIN pg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnum - WHERE - pg_attribute.attnum > 0 - AND attisdropped <> ''t'' - AND pg_class.oid = ' || v_oid || ' - ORDER BY pg_attribute.attnum' ; - - FOR v_rec IN EXECUTE v_sql LOOP - v_ret.fields_name=v_rec.fields_name; - v_ret.fields_type=v_rec.fields_type; - IF v_rec.fields_length > 0 THEN - v_ret.fields_length:=v_rec.fields_length; - ELSE - v_ret.fields_length:=NULL; - END IF; - v_ret.fields_not_null=v_rec.fields_not_null; - v_ret.fields_default=v_rec.fields_default; - v_ret.fields_comment=v_rec.fields_comment; - SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema=a_schema_name AND table_name=a_table_name AND column_name=v_rec.fields_name; - IF FOUND THEN - v_ret.fields_key_name=v_key; - ELSE - v_ret.fields_key_name=''; - END IF; - RETURN NEXT v_ret; - END LOOP; - RETURN ; -END; -$body$ -LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; - -COMMENT ON FUNCTION "public"."table_msg"(a_schema_name varchar, a_table_name varchar) -IS '获得表信息'; - ----重载一个函数 -CREATE OR REPLACE FUNCTION "public"."table_msg" (a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS -$body$ -DECLARE - v_ret tablestruct; -BEGIN - FOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOP - RETURN NEXT v_ret; - END LOOP; - RETURN; -END; -$body$ -LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; - -COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar) -IS '获得表信息'; \ No newline at end of file diff --git a/thinkphp/library/think/db/exception/BindParamException.php b/thinkphp/library/think/db/exception/BindParamException.php deleted file mode 100755 index 585a0d7..0000000 --- a/thinkphp/library/think/db/exception/BindParamException.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think\db\exception; - -use think\exception\DbException; - -/** - * PDO参数绑定异常 - */ -class BindParamException extends DbException -{ - - /** - * BindParamException constructor. - * @param string $message - * @param array $config - * @param string $sql - * @param array $bind - * @param int $code - */ - public function __construct($message, $config, $sql, $bind, $code = 10502) - { - $this->setData('Bind Param', $bind); - parent::__construct($message, $config, $sql, $code); - } -} diff --git a/thinkphp/library/think/db/exception/DataNotFoundException.php b/thinkphp/library/think/db/exception/DataNotFoundException.php deleted file mode 100755 index efd66d3..0000000 --- a/thinkphp/library/think/db/exception/DataNotFoundException.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think\db\exception; - -use think\exception\DbException; - -class DataNotFoundException extends DbException -{ - protected $table; - - /** - * DbException constructor. - * @param string $message - * @param string $table - * @param array $config - */ - public function __construct($message, $table = '', Array $config = []) - { - $this->message = $message; - $this->table = $table; - - $this->setData('Database Config', $config); - } - - /** - * 获取数据表名 - * @access public - * @return string - */ - public function getTable() - { - return $this->table; - } -} diff --git a/thinkphp/library/think/db/exception/ModelNotFoundException.php b/thinkphp/library/think/db/exception/ModelNotFoundException.php deleted file mode 100755 index 69b7096..0000000 --- a/thinkphp/library/think/db/exception/ModelNotFoundException.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think\db\exception; - -use think\exception\DbException; - -class ModelNotFoundException extends DbException -{ - protected $model; - - /** - * 构造方法 - * @param string $message - * @param string $model - */ - public function __construct($message, $model = '', Array $config = []) - { - $this->message = $message; - $this->model = $model; - - $this->setData('Database Config', $config); - } - - /** - * 获取模型类名 - * @access public - * @return string - */ - public function getModel() - { - return $this->model; - } - -} diff --git a/thinkphp/library/think/debug/Console.php b/thinkphp/library/think/debug/Console.php deleted file mode 100755 index 8a232c8..0000000 --- a/thinkphp/library/think/debug/Console.php +++ /dev/null @@ -1,160 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yangweijie <yangweijiester@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\debug; - -use think\Cache; -use think\Config; -use think\Db; -use think\Debug; -use think\Request; -use think\Response; - -/** - * 浏览器调试输出 - */ -class Console -{ - protected $config = [ - 'trace_tabs' => ['base' => '基本', 'file' => '文件', 'info' => '流程', 'notice|error' => '错误', 'sql' => 'SQL', 'debug|log' => '调试'], - ]; - - // 实例化并传入参数 - public function __construct($config = []) - { - if (is_array($config)) { - $this->config = array_merge($this->config, $config); - } - } - - /** - * 调试输出接口 - * @access public - * @param Response $response Response对象 - * @param array $log 日志信息 - * @return bool - */ - public function output(Response $response, array $log = []) - { - $request = Request::instance(); - $contentType = $response->getHeader('Content-Type'); - $accept = $request->header('accept'); - if (strpos($accept, 'application/json') === 0 || $request->isAjax()) { - return false; - } elseif (!empty($contentType) && strpos($contentType, 'html') === false) { - return false; - } - // 获取基本信息 - $runtime = number_format(microtime(true) - THINK_START_TIME, 10); - $reqs = $runtime > 0 ? number_format(1 / $runtime, 2) : '∞'; - $mem = number_format((memory_get_usage() - THINK_START_MEM) / 1024, 2); - - if (isset($_SERVER['HTTP_HOST'])) { - $uri = $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - } else { - $uri = 'cmd:' . implode(' ', $_SERVER['argv']); - } - - // 页面Trace信息 - $base = [ - '请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $uri, - '运行时间' => number_format($runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()), - '查询信息' => Db::$queryTimes . ' queries ' . Db::$executeTimes . ' writes ', - '缓存信息' => Cache::$readTimes . ' reads,' . Cache::$writeTimes . ' writes', - '配置加载' => count(Config::get()), - ]; - - if (session_id()) { - $base['会话信息'] = 'SESSION_ID=' . session_id(); - } - - $info = Debug::getFile(true); - - // 页面Trace信息 - $trace = []; - foreach ($this->config['trace_tabs'] as $name => $title) { - $name = strtolower($name); - switch ($name) { - case 'base': // 基本信息 - $trace[$title] = $base; - break; - case 'file': // 文件信息 - $trace[$title] = $info; - break; - default: // 调试信息 - if (strpos($name, '|')) { - // 多组信息 - $names = explode('|', $name); - $result = []; - foreach ($names as $name) { - $result = array_merge($result, isset($log[$name]) ? $log[$name] : []); - } - $trace[$title] = $result; - } else { - $trace[$title] = isset($log[$name]) ? $log[$name] : ''; - } - } - } - - //输出到控制台 - $lines = ''; - foreach ($trace as $type => $msg) { - $lines .= $this->console($type, $msg); - } - $js = <<<JS - -<script type='text/javascript'> -{$lines} -</script> -JS; - return $js; - } - - protected function console($type, $msg) - { - $type = strtolower($type); - $trace_tabs = array_values($this->config['trace_tabs']); - $line[] = ($type == $trace_tabs[0] || '调试' == $type || '错误' == $type) - ? "console.group('{$type}');" - : "console.groupCollapsed('{$type}');"; - - foreach ((array) $msg as $key => $m) { - switch ($type) { - case '调试': - $var_type = gettype($m); - if (in_array($var_type, ['array', 'string'])) { - $line[] = "console.log(" . json_encode($m) . ");"; - } else { - $line[] = "console.log(" . json_encode(var_export($m, 1)) . ");"; - } - break; - case '错误': - $msg = str_replace("\n", '\n', $m); - $style = 'color:#F4006B;font-size:14px;'; - $line[] = "console.error(\"%c{$msg}\", \"{$style}\");"; - break; - case 'sql': - $msg = str_replace("\n", '\n', $m); - $style = "color:#009bb4;"; - $line[] = "console.log(\"%c{$msg}\", \"{$style}\");"; - break; - default: - $m = is_string($key) ? $key . ' ' . $m : $key + 1 . ' ' . $m; - $msg = json_encode($m); - $line[] = "console.log({$msg});"; - break; - } - } - $line[] = "console.groupEnd();"; - return implode(PHP_EOL, $line); - } - -} diff --git a/thinkphp/library/think/debug/Html.php b/thinkphp/library/think/debug/Html.php deleted file mode 100755 index f8651aa..0000000 --- a/thinkphp/library/think/debug/Html.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\debug; - -use think\Cache; -use think\Config; -use think\Db; -use think\Debug; -use think\Request; -use think\Response; - -/** - * 页面Trace调试 - */ -class Html -{ - protected $config = [ - 'trace_file' => '', - 'trace_tabs' => ['base' => '基本', 'file' => '文件', 'info' => '流程', 'notice|error' => '错误', 'sql' => 'SQL', 'debug|log' => '调试'], - ]; - - // 实例化并传入参数 - public function __construct(array $config = []) - { - $this->config['trace_file'] = THINK_PATH . 'tpl/page_trace.tpl'; - $this->config = array_merge($this->config, $config); - } - - /** - * 调试输出接口 - * @access public - * @param Response $response Response对象 - * @param array $log 日志信息 - * @return bool - */ - public function output(Response $response, array $log = []) - { - $request = Request::instance(); - $contentType = $response->getHeader('Content-Type'); - $accept = $request->header('accept'); - if (strpos($accept, 'application/json') === 0 || $request->isAjax()) { - return false; - } elseif (!empty($contentType) && strpos($contentType, 'html') === false) { - return false; - } - // 获取基本信息 - $runtime = number_format(microtime(true) - THINK_START_TIME, 10); - $reqs = $runtime > 0 ? number_format(1 / $runtime, 2) : '∞'; - $mem = number_format((memory_get_usage() - THINK_START_MEM) / 1024, 2); - - // 页面Trace信息 - if (isset($_SERVER['HTTP_HOST'])) { - $uri = $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - } else { - $uri = 'cmd:' . implode(' ', $_SERVER['argv']); - } - $base = [ - '请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $uri, - '运行时间' => number_format($runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()), - '查询信息' => Db::$queryTimes . ' queries ' . Db::$executeTimes . ' writes ', - '缓存信息' => Cache::$readTimes . ' reads,' . Cache::$writeTimes . ' writes', - '配置加载' => count(Config::get()), - ]; - - if (session_id()) { - $base['会话信息'] = 'SESSION_ID=' . session_id(); - } - - $info = Debug::getFile(true); - - // 页面Trace信息 - $trace = []; - foreach ($this->config['trace_tabs'] as $name => $title) { - $name = strtolower($name); - switch ($name) { - case 'base': // 基本信息 - $trace[$title] = $base; - break; - case 'file': // 文件信息 - $trace[$title] = $info; - break; - default: // 调试信息 - if (strpos($name, '|')) { - // 多组信息 - $names = explode('|', $name); - $result = []; - foreach ($names as $name) { - $result = array_merge($result, isset($log[$name]) ? $log[$name] : []); - } - $trace[$title] = $result; - } else { - $trace[$title] = isset($log[$name]) ? $log[$name] : ''; - } - } - } - // 调用Trace页面模板 - ob_start(); - include $this->config['trace_file']; - return ob_get_clean(); - } - -} diff --git a/thinkphp/library/think/exception/ClassNotFoundException.php b/thinkphp/library/think/exception/ClassNotFoundException.php deleted file mode 100755 index eb22e73..0000000 --- a/thinkphp/library/think/exception/ClassNotFoundException.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -class ClassNotFoundException extends \RuntimeException -{ - protected $class; - public function __construct($message, $class = '') - { - $this->message = $message; - $this->class = $class; - } - - /** - * 获取类名 - * @access public - * @return string - */ - public function getClass() - { - return $this->class; - } -} diff --git a/thinkphp/library/think/exception/DbException.php b/thinkphp/library/think/exception/DbException.php deleted file mode 100755 index bd6fb44..0000000 --- a/thinkphp/library/think/exception/DbException.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think\exception; - -use think\Exception; - -/** - * Database相关异常处理类 - */ -class DbException extends Exception -{ - /** - * DbException constructor. - * @param string $message - * @param array $config - * @param string $sql - * @param int $code - */ - public function __construct($message, array $config, $sql, $code = 10500) - { - $this->message = $message; - $this->code = $code; - - $this->setData('Database Status', [ - 'Error Code' => $code, - 'Error Message' => $message, - 'Error SQL' => $sql, - ]); - - $this->setData('Database Config', $config); - } - -} diff --git a/thinkphp/library/think/exception/ErrorException.php b/thinkphp/library/think/exception/ErrorException.php deleted file mode 100755 index 2f1525c..0000000 --- a/thinkphp/library/think/exception/ErrorException.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think\exception; - -use think\Exception; - -/** - * ThinkPHP错误异常 - * 主要用于封装 set_error_handler 和 register_shutdown_function 得到的错误 - * 除开从 think\Exception 继承的功能 - * 其他和PHP系统\ErrorException功能基本一样 - */ -class ErrorException extends Exception -{ - /** - * 用于保存错误级别 - * @var integer - */ - protected $severity; - - /** - * 错误异常构造函数 - * @param integer $severity 错误级别 - * @param string $message 错误详细信息 - * @param string $file 出错文件路径 - * @param integer $line 出错行号 - * @param array $context 错误上下文,会包含错误触发处作用域内所有变量的数组 - */ - public function __construct($severity, $message, $file, $line, array $context = []) - { - $this->severity = $severity; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->code = 0; - - empty($context) || $this->setData('Error Context', $context); - } - - /** - * 获取错误级别 - * @return integer 错误级别 - */ - final public function getSeverity() - { - return $this->severity; - } -} diff --git a/thinkphp/library/think/exception/Handle.php b/thinkphp/library/think/exception/Handle.php deleted file mode 100755 index 8b6e6c4..0000000 --- a/thinkphp/library/think/exception/Handle.php +++ /dev/null @@ -1,266 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -use Exception; -use think\App; -use think\Config; -use think\console\Output; -use think\Lang; -use think\Log; -use think\Response; - -class Handle -{ - - protected $ignoreReport = [ - '\\think\\exception\\HttpException', - ]; - - /** - * Report or log an exception. - * - * @param \Exception $exception - * @return void - */ - public function report(Exception $exception) - { - if (!$this->isIgnoreReport($exception)) { - // 收集异常数据 - if (App::$debug) { - $data = [ - 'file' => $exception->getFile(), - 'line' => $exception->getLine(), - 'message' => $this->getMessage($exception), - 'code' => $this->getCode($exception), - ]; - $log = "[{$data['code']}]{$data['message']}[{$data['file']}:{$data['line']}]"; - } else { - $data = [ - 'code' => $this->getCode($exception), - 'message' => $this->getMessage($exception), - ]; - $log = "[{$data['code']}]{$data['message']}"; - } - - Log::record($log, 'error'); - } - } - - protected function isIgnoreReport(Exception $exception) - { - foreach ($this->ignoreReport as $class) { - if ($exception instanceof $class) { - return true; - } - } - return false; - } - - /** - * Render an exception into an HTTP response. - * - * @param \Exception $e - * @return Response - */ - public function render(Exception $e) - { - if ($e instanceof HttpException) { - return $this->renderHttpException($e); - } else { - return $this->convertExceptionToResponse($e); - } - } - - /** - * @param Output $output - * @param Exception $e - */ - public function renderForConsole(Output $output, Exception $e) - { - if (App::$debug) { - $output->setVerbosity(Output::VERBOSITY_DEBUG); - } - $output->renderException($e); - } - - /** - * @param HttpException $e - * @return Response - */ - protected function renderHttpException(HttpException $e) - { - $status = $e->getStatusCode(); - $template = Config::get('http_exception_template'); - if (!App::$debug && !empty($template[$status])) { - return Response::create($template[$status], 'view', $status)->assign(['e' => $e]); - } else { - return $this->convertExceptionToResponse($e); - } - } - - /** - * @param Exception $exception - * @return Response - */ - protected function convertExceptionToResponse(Exception $exception) - { - // 收集异常数据 - if (App::$debug) { - // 调试模式,获取详细的错误信息 - $data = [ - 'name' => get_class($exception), - 'file' => $exception->getFile(), - 'line' => $exception->getLine(), - 'message' => $this->getMessage($exception), - 'trace' => $exception->getTrace(), - 'code' => $this->getCode($exception), - 'source' => $this->getSourceCode($exception), - 'datas' => $this->getExtendData($exception), - 'tables' => [ - 'GET Data' => $_GET, - 'POST Data' => $_POST, - 'Files' => $_FILES, - 'Cookies' => $_COOKIE, - 'Session' => isset($_SESSION) ? $_SESSION : [], - 'Server/Request Data' => $_SERVER, - 'Environment Variables' => $_ENV, - 'ThinkPHP Constants' => $this->getConst(), - ], - ]; - } else { - // 部署模式仅显示 Code 和 Message - $data = [ - 'code' => $this->getCode($exception), - 'message' => $this->getMessage($exception), - ]; - - if (!Config::get('show_error_msg')) { - // 不显示详细错误信息 - $data['message'] = Config::get('error_message'); - } - } - - //保留一层 - while (ob_get_level() > 1) { - ob_end_clean(); - } - - $data['echo'] = ob_get_clean(); - - ob_start(); - extract($data); - include Config::get('exception_tmpl'); - // 获取并清空缓存 - $content = ob_get_clean(); - $response = new Response($content, 'html'); - - if ($exception instanceof HttpException) { - $statusCode = $exception->getStatusCode(); - $response->header($exception->getHeaders()); - } - - if (!isset($statusCode)) { - $statusCode = 500; - } - $response->code($statusCode); - return $response; - } - - /** - * 获取错误编码 - * ErrorException则使用错误级别作为错误编码 - * @param \Exception $exception - * @return integer 错误编码 - */ - protected function getCode(Exception $exception) - { - $code = $exception->getCode(); - if (!$code && $exception instanceof ErrorException) { - $code = $exception->getSeverity(); - } - return $code; - } - - /** - * 获取错误信息 - * ErrorException则使用错误级别作为错误编码 - * @param \Exception $exception - * @return string 错误信息 - */ - protected function getMessage(Exception $exception) - { - $message = $exception->getMessage(); - if (IS_CLI) { - return $message; - } - - if (strpos($message, ':')) { - $name = strstr($message, ':', true); - $message = Lang::has($name) ? Lang::get($name) . strstr($message, ':') : $message; - } elseif (strpos($message, ',')) { - $name = strstr($message, ',', true); - $message = Lang::has($name) ? Lang::get($name) . ':' . substr(strstr($message, ','), 1) : $message; - } elseif (Lang::has($message)) { - $message = Lang::get($message); - } - return $message; - } - - /** - * 获取出错文件内容 - * 获取错误的前9行和后9行 - * @param \Exception $exception - * @return array 错误文件内容 - */ - protected function getSourceCode(Exception $exception) - { - // 读取前9行和后9行 - $line = $exception->getLine(); - $first = ($line - 9 > 0) ? $line - 9 : 1; - - try { - $contents = file($exception->getFile()); - $source = [ - 'first' => $first, - 'source' => array_slice($contents, $first - 1, 19), - ]; - } catch (Exception $e) { - $source = []; - } - return $source; - } - - /** - * 获取异常扩展信息 - * 用于非调试模式html返回类型显示 - * @param \Exception $exception - * @return array 异常类定义的扩展数据 - */ - protected function getExtendData(Exception $exception) - { - $data = []; - if ($exception instanceof \think\Exception) { - $data = $exception->getData(); - } - return $data; - } - - /** - * 获取常量列表 - * @return array 常量列表 - */ - private static function getConst() - { - return get_defined_constants(true)['user']; - } -} diff --git a/thinkphp/library/think/exception/HttpException.php b/thinkphp/library/think/exception/HttpException.php deleted file mode 100755 index 01a27fc..0000000 --- a/thinkphp/library/think/exception/HttpException.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -class HttpException extends \RuntimeException -{ - private $statusCode; - private $headers; - - public function __construct($statusCode, $message = null, \Exception $previous = null, array $headers = [], $code = 0) - { - $this->statusCode = $statusCode; - $this->headers = $headers; - - parent::__construct($message, $code, $previous); - } - - public function getStatusCode() - { - return $this->statusCode; - } - - public function getHeaders() - { - return $this->headers; - } -} diff --git a/thinkphp/library/think/exception/HttpResponseException.php b/thinkphp/library/think/exception/HttpResponseException.php deleted file mode 100755 index 5297286..0000000 --- a/thinkphp/library/think/exception/HttpResponseException.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -use think\Response; - -class HttpResponseException extends \RuntimeException -{ - /** - * @var Response - */ - protected $response; - - public function __construct(Response $response) - { - $this->response = $response; - } - - public function getResponse() - { - return $this->response; - } - -} diff --git a/thinkphp/library/think/exception/PDOException.php b/thinkphp/library/think/exception/PDOException.php deleted file mode 100755 index 677092b..0000000 --- a/thinkphp/library/think/exception/PDOException.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://zjzit.cn> -// +---------------------------------------------------------------------- - -namespace think\exception; - -use think\exception\DbException; - -/** - * PDO异常处理类 - * 重新封装了系统的\PDOException类 - */ -class PDOException extends DbException -{ - /** - * PDOException constructor. - * @param \PDOException $exception - * @param array $config - * @param string $sql - * @param int $code - */ - public function __construct(\PDOException $exception, array $config, $sql, $code = 10501) - { - $error = $exception->errorInfo; - - $this->setData('PDO Error Info', [ - 'SQLSTATE' => $error[0], - 'Driver Error Code' => isset($error[1]) ? $error[1] : 0, - 'Driver Error Message' => isset($error[2]) ? $error[2] : '', - ]); - - parent::__construct($exception->getMessage(), $config, $sql, $code); - } -} diff --git a/thinkphp/library/think/exception/RouteNotFoundException.php b/thinkphp/library/think/exception/RouteNotFoundException.php deleted file mode 100755 index 6ee2f7b..0000000 --- a/thinkphp/library/think/exception/RouteNotFoundException.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -use think\exception\HttpException; - -class RouteNotFoundException extends HttpException -{ - - public function __construct() - { - parent::__construct(404); - } - -} diff --git a/thinkphp/library/think/exception/TemplateNotFoundException.php b/thinkphp/library/think/exception/TemplateNotFoundException.php deleted file mode 100755 index 4202069..0000000 --- a/thinkphp/library/think/exception/TemplateNotFoundException.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -class TemplateNotFoundException extends \RuntimeException -{ - protected $template; - - public function __construct($message, $template = '') - { - $this->message = $message; - $this->template = $template; - } - - /** - * 获取模板文件 - * @access public - * @return string - */ - public function getTemplate() - { - return $this->template; - } -} diff --git a/thinkphp/library/think/exception/ThrowableError.php b/thinkphp/library/think/exception/ThrowableError.php deleted file mode 100755 index 87b6b9d..0000000 --- a/thinkphp/library/think/exception/ThrowableError.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -class ThrowableError extends \ErrorException -{ - public function __construct(\Throwable $e) - { - - if ($e instanceof \ParseError) { - $message = 'Parse error: ' . $e->getMessage(); - $severity = E_PARSE; - } elseif ($e instanceof \TypeError) { - $message = 'Type error: ' . $e->getMessage(); - $severity = E_RECOVERABLE_ERROR; - } else { - $message = 'Fatal error: ' . $e->getMessage(); - $severity = E_ERROR; - } - - parent::__construct( - $message, - $e->getCode(), - $severity, - $e->getFile(), - $e->getLine() - ); - - $this->setTrace($e->getTrace()); - } - - protected function setTrace($trace) - { - $traceReflector = new \ReflectionProperty('Exception', 'trace'); - $traceReflector->setAccessible(true); - $traceReflector->setValue($this, $trace); - } -} diff --git a/thinkphp/library/think/exception/ValidateException.php b/thinkphp/library/think/exception/ValidateException.php deleted file mode 100755 index b368416..0000000 --- a/thinkphp/library/think/exception/ValidateException.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\exception; - -class ValidateException extends \RuntimeException -{ - protected $error; - - public function __construct($error) - { - $this->error = $error; - $this->message = is_array($error) ? implode("\n\r", $error) : $error; - } - - /** - * 获取验证错误信息 - * @access public - * @return array|string - */ - public function getError() - { - return $this->error; - } -} diff --git a/thinkphp/library/think/log/driver/File.php b/thinkphp/library/think/log/driver/File.php deleted file mode 100755 index c4e4627..0000000 --- a/thinkphp/library/think/log/driver/File.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\log\driver; - -/** - * 本地化调试输出到文件 - */ -class File -{ - protected $config = [ - 'time_format' => ' c ', - 'file_size' => 2097152, - 'path' => LOG_PATH, - 'apart_level' => [], - ]; - - // 实例化并传入参数 - public function __construct($config = []) - { - if (is_array($config)) { - $this->config = array_merge($this->config, $config); - } - } - - /** - * 日志写入接口 - * @access public - * @param array $log 日志信息 - * @return bool - */ - public function save(array $log = []) - { - $now = date($this->config['time_format']); - $destination = $this->config['path'] . date('Ym') . DS . date('d') . '.log'; - - $path = dirname($destination); - !is_dir($path) && mkdir($path, 0755, true); - - //检测日志文件大小,超过配置大小则备份日志文件重新生成 - if (is_file($destination) && floor($this->config['file_size']) <= filesize($destination)) { - rename($destination, dirname($destination) . DS . $_SERVER['REQUEST_TIME'] . '-' . basename($destination)); - } - - // 获取基本信息 - if (isset($_SERVER['HTTP_HOST'])) { - $current_uri = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - } else { - $current_uri = "cmd:" . implode(' ', $_SERVER['argv']); - } - - $runtime = number_format(microtime(true) - THINK_START_TIME, 10); - $reqs = $runtime > 0 ? number_format(1 / $runtime, 2) : '∞'; - $time_str = ' [运行时间:' . number_format($runtime, 6) . 's][吞吐率:' . $reqs . 'req/s]'; - $memory_use = number_format((memory_get_usage() - THINK_START_MEM) / 1024, 2); - $memory_str = ' [内存消耗:' . $memory_use . 'kb]'; - $file_load = ' [文件加载:' . count(get_included_files()) . ']'; - - $info = '[ log ] ' . $current_uri . $time_str . $memory_str . $file_load . "\r\n"; - $server = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : '0.0.0.0'; - $remote = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0'; - $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'CLI'; - $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; - foreach ($log as $type => $val) { - $level = ''; - foreach ($val as $msg) { - if (!is_string($msg)) { - $msg = var_export($msg, true); - } - $level .= '[ ' . $type . ' ] ' . $msg . "\r\n"; - } - if (in_array($type, $this->config['apart_level'])) { - // 独立记录的日志级别 - $filename = $path . DS . date('d') . '_' . $type . '.log'; - error_log("[{$now}] {$server} {$remote} {$method} {$uri}\r\n{$level}\r\n---------------------------------------------------------------\r\n", 3, $filename); - } else { - $info .= $level; - } - } - return error_log("[{$now}] {$server} {$remote} {$method} {$uri}\r\n{$info}\r\n---------------------------------------------------------------\r\n", 3, $destination); - } - -} diff --git a/thinkphp/library/think/log/driver/Socket.php b/thinkphp/library/think/log/driver/Socket.php deleted file mode 100755 index f24b609..0000000 --- a/thinkphp/library/think/log/driver/Socket.php +++ /dev/null @@ -1,245 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: luofei614 <weibo.com/luofei614> -// +---------------------------------------------------------------------- - -namespace think\log\driver; - -/** - * github: https://github.com/luofei614/SocketLog - * @author luofei614<weibo.com/luofei614> - */ -class Socket -{ - public $port = 1116; //SocketLog 服务的http的端口号 - - protected $config = [ - // socket服务器地址 - 'host' => 'localhost', - // 是否显示加载的文件列表 - 'show_included_files' => false, - // 日志强制记录到配置的client_id - 'force_client_ids' => [], - // 限制允许读取日志的client_id - 'allow_client_ids' => [], - ]; - - protected $css = [ - 'sql' => 'color:#009bb4;', - 'sql_warn' => 'color:#009bb4;font-size:14px;', - 'error' => 'color:#f4006b;font-size:14px;', - 'page' => 'color:#40e2ff;background:#171717;', - 'big' => 'font-size:20px;color:red;', - ]; - - protected $allowForceClientIds = []; //配置强制推送且被授权的client_id - - /** - * 架构函数 - * @param array $config 缓存参数 - * @access public - */ - public function __construct(array $config = []) - { - if (!empty($config)) { - $this->config = array_merge($this->config, $config); - } - } - - /** - * 调试输出接口 - * @access public - * @param array $log 日志信息 - * @return bool - */ - public function save(array $log = []) - { - if (!$this->check()) { - return false; - } - $runtime = number_format(microtime(true) - THINK_START_TIME, 10); - $reqs = $runtime > 0 ? number_format(1 / $runtime, 2) : '∞'; - $time_str = ' [运行时间:' . number_format($runtime, 6) . 's][吞吐率:' . $reqs . 'req/s]'; - $memory_use = number_format((memory_get_usage() - THINK_START_MEM) / 1024, 2); - $memory_str = ' [内存消耗:' . $memory_use . 'kb]'; - $file_load = ' [文件加载:' . count(get_included_files()) . ']'; - - if (isset($_SERVER['HTTP_HOST'])) { - $current_uri = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - } else { - $current_uri = 'cmd:' . implode(' ', $_SERVER['argv']); - } - // 基本信息 - $trace[] = [ - 'type' => 'group', - 'msg' => $current_uri . $time_str . $memory_str . $file_load, - 'css' => $this->css['page'], - ]; - - foreach ($log as $type => $val) { - $trace[] = [ - 'type' => 'groupCollapsed', - 'msg' => '[ ' . $type . ' ]', - 'css' => isset($this->css[$type]) ? $this->css[$type] : '', - ]; - foreach ($val as $msg) { - if (!is_string($msg)) { - $msg = var_export($msg, true); - } - $trace[] = [ - 'type' => 'log', - 'msg' => $msg, - 'css' => '', - ]; - } - $trace[] = [ - 'type' => 'groupEnd', - 'msg' => '', - 'css' => '', - ]; - } - - if ($this->config['show_included_files']) { - $trace[] = [ - 'type' => 'groupCollapsed', - 'msg' => '[ file ]', - 'css' => '', - ]; - $trace[] = [ - 'type' => 'log', - 'msg' => implode("\n", get_included_files()), - 'css' => '', - ]; - $trace[] = [ - 'type' => 'groupEnd', - 'msg' => '', - 'css' => '', - ]; - } - - $trace[] = [ - 'type' => 'groupEnd', - 'msg' => '', - 'css' => '', - ]; - - $tabid = $this->getClientArg('tabid'); - if (!$client_id = $this->getClientArg('client_id')) { - $client_id = ''; - } - - if (!empty($this->allowForceClientIds)) { - //强制推送到多个client_id - foreach ($this->allowForceClientIds as $force_client_id) { - $client_id = $force_client_id; - $this->sendToClient($tabid, $client_id, $trace, $force_client_id); - } - } else { - $this->sendToClient($tabid, $client_id, $trace, ''); - } - return true; - } - - /** - * 发送给指定客户端 - * @author Zjmainstay - * @param $tabid - * @param $client_id - * @param $logs - * @param $force_client_id - */ - protected function sendToClient($tabid, $client_id, $logs, $force_client_id) - { - $logs = [ - 'tabid' => $tabid, - 'client_id' => $client_id, - 'logs' => $logs, - 'force_client_id' => $force_client_id, - ]; - $msg = @json_encode($logs); - $address = '/' . $client_id; //将client_id作为地址, server端通过地址判断将日志发布给谁 - $this->send($this->config['host'], $msg, $address); - } - - protected function check() - { - $tabid = $this->getClientArg('tabid'); - //是否记录日志的检查 - if (!$tabid && !$this->config['force_client_ids']) { - return false; - } - //用户认证 - $allow_client_ids = $this->config['allow_client_ids']; - if (!empty($allow_client_ids)) { - //通过数组交集得出授权强制推送的client_id - $this->allowForceClientIds = array_intersect($allow_client_ids, $this->config['force_client_ids']); - if (!$tabid && count($this->allowForceClientIds)) { - return true; - } - - $client_id = $this->getClientArg('client_id'); - if (!in_array($client_id, $allow_client_ids)) { - return false; - } - } else { - $this->allowForceClientIds = $this->config['force_client_ids']; - } - return true; - } - - protected function getClientArg($name) - { - static $args = []; - - $key = 'HTTP_USER_AGENT'; - - if (isset($_SERVER['HTTP_SOCKETLOG'])) { - $key = 'HTTP_SOCKETLOG'; - } - - if (!isset($_SERVER[$key])) { - return null; - } - if (empty($args)) { - if (!preg_match('/SocketLog\((.*?)\)/', $_SERVER[$key], $match)) { - $args = ['tabid' => null]; - return null; - } - parse_str($match[1], $args); - } - if (isset($args[$name])) { - return $args[$name]; - } - return null; - } - - /** - * @param string $host - $host of socket server - * @param string $message - 发送的消息 - * @param string $address - 地址 - * @return bool - */ - protected function send($host, $message = '', $address = '/') - { - $url = 'http://' . $host . ':' . $this->port . $address; - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $message); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - $headers = [ - "Content-Type: application/json;charset=UTF-8", - ]; - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //设置header - return curl_exec($ch); - } - -} diff --git a/thinkphp/library/think/model/Merge.php b/thinkphp/library/think/model/Merge.php deleted file mode 100755 index de8d9e1..0000000 --- a/thinkphp/library/think/model/Merge.php +++ /dev/null @@ -1,316 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\model; - -use think\Db; -use think\Model; - -class Merge extends Model -{ - - protected $relationModel = []; // HAS ONE 关联的模型列表 - protected $fk = ''; // 外键名 默认为主表名_id - protected $mapFields = []; // 需要处理的模型映射字段,避免混淆 array( id => 'user.id' ) - - /** - * 架构函数 - * @access public - * @param array|object $data 数据 - */ - public function __construct($data = []) - { - parent::__construct($data); - - // 设置默认外键名 仅支持单一外键 - if (empty($this->fk)) { - $this->fk = strtolower($this->name) . '_id'; - } - } - - /** - * 查找单条记录 - * @access public - * @param mixed $data 主键值或者查询条件(闭包) - * @param string $with 关联预查询 - * @param bool $cache 是否缓存 - * @return \think\Model - */ - public static function get($data = null, $with = [], $cache = false) - { - $query = self::parseQuery($data, $with, $cache); - $query = self::attachQuery($query); - return $query->find($data); - } - - /** - * 附加查询表达式 - * @access protected - * @param \think\db\Query $query 查询对象 - * @return \think\db\Query - */ - protected static function attachQuery($query) - { - $class = new static(); - $master = $class->name; - $fields = self::getModelField($query, $master, '', $class->mapFields, $class->field); - $query->alias($master)->field($fields); - - foreach ($class->relationModel as $key => $model) { - $name = is_int($key) ? $model : $key; - $table = is_int($key) ? $query->getTable($name) : $model; - $query->join($table . ' ' . $name, $name . '.' . $class->fk . '=' . $master . '.' . $class->getPk()); - $fields = self::getModelField($query, $name, $table, $class->mapFields, $class->field); - $query->field($fields); - } - return $query; - } - - /** - * 获取关联模型的字段 并解决混淆 - * @access protected - * @param \think\db\Query $query 查询对象 - * @param string $name 模型名称 - * @param string $table 关联表名称 - * @param array $map 字段映射 - * @param array $fields 查询字段 - * @return array - */ - protected static function getModelField($query, $name, $table = '', $map = [], $fields = []) - { - // 获取模型的字段信息 - $fields = $fields ?: $query->getTableInfo($table, 'fields'); - $array = []; - foreach ($fields as $field) { - if ($key = array_search($name . '.' . $field, $map)) { - // 需要处理映射字段 - $array[] = $name . '.' . $field . ' AS ' . $key; - } else { - $array[] = $field; - } - } - return $array; - } - - /** - * 查找所有记录 - * @access public - * @param mixed $data 主键列表或者查询条件(闭包) - * @param string $with 关联预查询 - * @return array|false|string - */ - public static function all($data = null, $with = [], $cache = false) - { - $query = self::parseQuery($data, $with, $cache); - $query = self::attachQuery($query); - return $query->select($data); - } - - /** - * 处理写入的模型数据 - * @access public - * @param string $model 模型名称 - * @param array $data 数据 - * @param bool $insert 是否新增 - * @return void - */ - protected function parseData($model, $data, $insert = false) - { - $item = []; - foreach ($data as $key => $val) { - if ($insert || in_array($key, $this->change) || $this->isPk($key)) { - if ($this->fk != $key && array_key_exists($key, $this->mapFields)) { - list($name, $key) = explode('.', $this->mapFields[$key]); - if ($model == $name) { - $item[$key] = $val; - } - } else { - $item[$key] = $val; - } - } - } - return $item; - } - - /** - * 保存模型数据 以及关联数据 - * @access public - * @param mixed $data 数据 - * @param array $where 更新条件 - * @param string $sequence 自增序列名 - * @return integer|false - */ - public function save($data = [], $where = [], $sequence = null) - { - if (!empty($data)) { - // 数据自动验证 - if (!$this->validateData($data)) { - return false; - } - // 数据对象赋值 - foreach ($data as $key => $value) { - $this->setAttr($key, $value); - } - if (!empty($where)) { - $this->isUpdate = true; - } - } - - // 数据自动完成 - $this->autoCompleteData($this->auto); - - // 自动写入更新时间 - if ($this->autoWriteTimestamp && $this->updateTime) { - $this->setAttr($this->updateTime, null); - } - - $db = $this->db(); - $db->startTrans(); - try { - if ($this->isUpdate) { - // 自动写入 - $this->autoCompleteData($this->update); - - if (false === $this->trigger('before_update', $this)) { - return false; - } - - if (empty($where) && !empty($this->updateWhere)) { - $where = $this->updateWhere; - } - - if (!empty($where)) { - $pk = $this->getPk(); - - if (isset($this->mapFields[$pk])) { - $pk = $this->mapFields[$pk]; - } - if (isset($where[$pk])) { - unset($where[$pk]); - } - } - - // 处理模型数据 - $data = $this->parseData($this->name, $this->data); - // 写入主表数据 - $result = $db->strict(false)->where($where)->update($data); - - // 写入附表数据 - foreach ($this->relationModel as $key => $model) { - $name = is_int($key) ? $model : $key; - $table = is_int($key) ? $db->getTable($model) : $model; - // 处理关联模型数据 - $data = $this->parseData($name, $this->data); - $query = clone $db; - if ($query->table($table)->strict(false)->where($this->fk, $this->data[$this->getPk()])->update($data)) { - $result = 1; - } - } - // 清空change - $this->change = []; - // 新增回调 - $this->trigger('after_update', $this); - } else { - // 自动写入 - $this->autoCompleteData($this->insert); - - // 自动写入创建时间 - if ($this->autoWriteTimestamp && $this->createTime) { - $this->setAttr($this->createTime, null); - } - - if (false === $this->trigger('before_insert', $this)) { - return false; - } - - // 处理模型数据 - $data = $this->parseData($this->name, $this->data, true); - // 写入主表数据 - $result = $db->name($this->name)->strict(false)->insert($data); - if ($result) { - $insertId = $db->getLastInsID($sequence); - // 写入外键数据 - $pk = $this->getPk(); - if ($insertId) { - if (is_string($pk)) { - $this->data[$pk] = $insertId; - if ($this->fk == $pk) { - $this->change[] = $pk; - } - } - $this->data[$this->fk] = $insertId; - } - - // 写入附表数据 - $source = $this->data; - if ($insertId && is_string($pk) && isset($source[$pk]) && $this->fk != $pk) { - unset($source[$pk]); - } - foreach ($this->relationModel as $key => $model) { - $name = is_int($key) ? $model : $key; - $table = is_int($key) ? $db->getTable($model) : $model; - // 处理关联模型数据 - $data = $this->parseData($name, $source, true); - $query = clone $db; - $query->table($table)->strict(false)->insert($data); - } - } - // 标记为更新 - $this->isUpdate = true; - // 清空change - $this->change = []; - // 新增回调 - $this->trigger('after_insert', $this); - } - $db->commit(); - return $result; - } catch (\Exception $e) { - $db->rollback(); - throw $e; - } - } - - /** - * 删除当前的记录 并删除关联数据 - * @access public - * @return integer - */ - public function delete() - { - if (false === $this->trigger('before_delete', $this)) { - return false; - } - - $db = $this->db(); - $db->startTrans(); - try { - $result = $db->delete($this->data); - if ($result) { - // 获取主键数据 - $pk = $this->data[$this->getPk()]; - - // 删除关联数据 - foreach ($this->relationModel as $key => $model) { - $table = is_int($key) ? $db->getTable($model) : $model; - $query = clone $db; - $query->table($table)->where($this->fk, $pk)->delete(); - } - } - $this->trigger('after_delete', $this); - $db->commit(); - return $result; - } catch (\Exception $e) { - $db->rollback(); - throw $e; - } - } - -} diff --git a/thinkphp/library/think/model/Pivot.php b/thinkphp/library/think/model/Pivot.php deleted file mode 100755 index 24034b0..0000000 --- a/thinkphp/library/think/model/Pivot.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\model; - -use think\Model; - -class Pivot extends Model -{ - - /** - * 架构函数 - * @access public - * @param array|object $data 数据 - * @param string $table 中间数据表名 - */ - public function __construct($data = [], $table = '') - { - if (is_object($data)) { - $this->data = get_object_vars($data); - } else { - $this->data = $data; - } - - $this->table = $table; - } - -} diff --git a/thinkphp/library/think/model/Relation.php b/thinkphp/library/think/model/Relation.php deleted file mode 100755 index f9675c1..0000000 --- a/thinkphp/library/think/model/Relation.php +++ /dev/null @@ -1,705 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\model; - -use think\Db; -use think\Exception; -use think\Loader; -use think\Model; -use think\model\Pivot; - -class Relation -{ - const HAS_ONE = 1; - const HAS_MANY = 2; - const HAS_MANY_THROUGH = 5; - const BELONGS_TO = 3; - const BELONGS_TO_MANY = 4; - - // 父模型对象 - protected $parent; - /** @var Model 当前关联的模型类 */ - protected $model; - // 中间表模型 - protected $middle; - // 当前关联类型 - protected $type; - // 关联表外键 - protected $foreignKey; - // 中间关联表外键 - protected $throughKey; - // 关联表主键 - protected $localKey; - // 数据表别名 - protected $alias; - // 当前关联的JOIN类型 - protected $joinType; - // 关联模型查询对象 - protected $query; - // 关联查询条件 - protected $where; - // 关联查询参数 - protected $option; - /** - * 架构函数 - * @access public - * @param Model $model 上级模型对象 - */ - public function __construct(Model $model) - { - $this->parent = $model; - } - - /** - * 获取当前关联信息 - * @access public - * @param string $name 关联信息 - * @return array|string|integer - */ - public function getRelationInfo($name = '') - { - $info = [ - 'type' => $this->type, - 'model' => $this->model, - 'middle' => $this->middle, - 'foreignKey' => $this->foreignKey, - 'localKey' => $this->localKey, - 'alias' => $this->alias, - 'joinType' => $this->joinType, - 'option' => $this->option, - ]; - return $name ? $info[$name] : $info; - } - - // 获取关联数据 - public function getRelation($name) - { - // 执行关联定义方法 - $relation = $this->parent->$name(); - $foreignKey = $this->foreignKey; - $localKey = $this->localKey; - - // 判断关联类型执行查询 - switch ($this->type) { - case self::HAS_ONE: - $result = $relation->where($foreignKey, $this->parent->$localKey)->find(); - break; - case self::BELONGS_TO: - $result = $relation->where($localKey, $this->parent->$foreignKey)->find(); - break; - case self::HAS_MANY: - $result = $relation->select(); - break; - case self::HAS_MANY_THROUGH: - $result = $relation->select(); - break; - case self::BELONGS_TO_MANY: - // 关联查询 - $pk = $this->parent->getPk(); - $condition['pivot.' . $localKey] = $this->parent->$pk; - $result = $this->belongsToManyQuery($relation, $this->middle, $foreignKey, $localKey, $condition)->select(); - foreach ($result as $set) { - $pivot = []; - foreach ($set->getData() as $key => $val) { - if (strpos($key, '__')) { - list($name, $attr) = explode('__', $key, 2); - if ('pivot' == $name) { - $pivot[$attr] = $val; - unset($set->$key); - } - } - } - $set->pivot = new Pivot($pivot, $this->middle); - } - break; - default: - // 直接返回 - $result = $relation; - } - return $result; - } - - /** - * 预载入关联查询 返回数据集 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 关联名 - * @param string $class 数据集对象名 为空表示数组 - * @return array - */ - public function eagerlyResultSet($resultSet, $relation, $class = '') - { - /** @var array $relations */ - $relations = is_string($relation) ? explode(',', $relation) : $relation; - - foreach ($relations as $key => $relation) { - $subRelation = ''; - $closure = false; - if ($relation instanceof \Closure) { - $closure = $relation; - $relation = $key; - } - if (strpos($relation, '.')) { - list($relation, $subRelation) = explode('.', $relation); - } - // 执行关联方法 - $model = $this->parent->$relation(); - // 获取关联信息 - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - switch ($this->type) { - case self::HAS_ONE: - case self::BELONGS_TO: - foreach ($resultSet as $result) { - // 模型关联组装 - $this->match($this->model, $relation, $result); - } - break; - case self::HAS_MANY: - $range = []; - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$localKey)) { - $range[] = $result->$localKey; - } - } - - if (!empty($range)) { - $this->where[$foreignKey] = ['in', $range]; - $data = $this->eagerlyOneToMany($model, [ - $foreignKey => [ - 'in', - $range, - ], - ], $relation, $subRelation, $closure); - - // 关联数据封装 - foreach ($resultSet as $result) { - if (!isset($data[$result->$localKey])) { - $data[$result->$localKey] = []; - } - $result->setAttr($relation, $this->resultSetBuild($data[$result->$localKey], $class)); - } - } - break; - case self::BELONGS_TO_MANY: - $pk = $resultSet[0]->getPk(); - $range = []; - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$pk)) { - $range[] = $result->$pk; - } - } - - if (!empty($range)) { - // 查询关联数据 - $data = $this->eagerlyManyToMany($model, [ - 'pivot.' . $localKey => [ - 'in', - $range, - ], - ], $relation, $subRelation); - - // 关联数据封装 - foreach ($resultSet as $result) { - if (!isset($data[$result->$pk])) { - $data[$result->$pk] = []; - } - - $result->setAttr($relation, $this->resultSetBuild($data[$result->$pk], $class)); - } - } - break; - } - } - return $resultSet; - } - - /** - * 封装关联数据集 - * @access public - * @param array $resultSet 数据集 - * @param string $class 数据集类名 - * @return mixed - */ - protected function resultSetBuild($resultSet, $class = '') - { - return $class ? new $class($resultSet) : $resultSet; - } - - /** - * 预载入关联查询 返回模型对象 - * @access public - * @param Model $result 数据对象 - * @param string $relation 关联名 - * @param string $class 数据集对象名 为空表示数组 - * @return Model - */ - public function eagerlyResult($result, $relation, $class = '') - { - $relations = is_string($relation) ? explode(',', $relation) : $relation; - - foreach ($relations as $key => $relation) { - $subRelation = ''; - $closure = false; - if ($relation instanceof \Closure) { - $closure = $relation; - $relation = $key; - } - if (strpos($relation, '.')) { - list($relation, $subRelation) = explode('.', $relation); - } - // 执行关联方法 - $model = $this->parent->$relation(); - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - switch ($this->type) { - case self::HAS_ONE: - case self::BELONGS_TO: - // 模型关联组装 - $this->match($this->model, $relation, $result); - break; - case self::HAS_MANY: - if (isset($result->$localKey)) { - $data = $this->eagerlyOneToMany($model, [$foreignKey => $result->$localKey], $relation, $subRelation, $closure); - // 关联数据封装 - if (!isset($data[$result->$localKey])) { - $data[$result->$localKey] = []; - } - $result->setAttr($relation, $this->resultSetBuild($data[$result->$localKey], $class)); - } - break; - case self::BELONGS_TO_MANY: - $pk = $result->getPk(); - if (isset($result->$pk)) { - $pk = $result->$pk; - // 查询管理数据 - $data = $this->eagerlyManyToMany($model, ['pivot.' . $localKey => $pk], $relation, $subRelation); - - // 关联数据封装 - if (!isset($data[$pk])) { - $data[$pk] = []; - } - $result->setAttr($relation, $this->resultSetBuild($data[$pk], $class)); - } - break; - - } - } - return $result; - } - - /** - * 一对一 关联模型预查询拼装 - * @access public - * @param string $model 模型名称 - * @param string $relation 关联名 - * @param Model $result 模型对象实例 - * @return void - */ - protected function match($model, $relation, &$result) - { - // 重新组装模型数据 - foreach ($result->getData() as $key => $val) { - if (strpos($key, '__')) { - list($name, $attr) = explode('__', $key, 2); - if ($name == $relation) { - $list[$name][$attr] = $val; - unset($result->$key); - } - } - } - - $result->setAttr($relation, !isset($list[$relation]) ? null : (new $model($list[$relation]))->isUpdate(true)); - } - - /** - * 一对多 关联模型预查询 - * @access public - * @param object $model 关联模型对象 - * @param array $where 关联预查询条件 - * @param string $relation 关联名 - * @param string $subRelation 子关联 - * @param bool $closure - * @return array - */ - protected function eagerlyOneToMany($model, $where, $relation, $subRelation = '', $closure = false) - { - $foreignKey = $this->foreignKey; - // 预载入关联查询 支持嵌套预载入 - if ($closure) { - call_user_func_array($closure, [ & $model]); - } - $list = $model->where($where)->with($subRelation)->select(); - - // 组装模型数据 - $data = []; - foreach ($list as $set) { - $data[$set->$foreignKey][] = $set; - } - return $data; - } - - /** - * 多对多 关联模型预查询 - * @access public - * @param object $model 关联模型对象 - * @param array $where 关联预查询条件 - * @param string $relation 关联名 - * @param string $subRelation 子关联 - * @return array - */ - protected function eagerlyManyToMany($model, $where, $relation, $subRelation = '') - { - $foreignKey = $this->foreignKey; - $localKey = $this->localKey; - // 预载入关联查询 支持嵌套预载入 - $list = $this->belongsToManyQuery($model, $this->middle, $foreignKey, $localKey, $where)->with($subRelation)->select(); - - // 组装模型数据 - $data = []; - foreach ($list as $set) { - $pivot = []; - foreach ($set->getData() as $key => $val) { - if (strpos($key, '__')) { - list($name, $attr) = explode('__', $key, 2); - if ('pivot' == $name) { - $pivot[$attr] = $val; - unset($set->$key); - } - } - } - $set->pivot = new Pivot($pivot, $this->middle); - $data[$pivot[$localKey]][] = $set; - } - return $data; - } - - /** - * 设置当前关联定义的数据表别名 - * @access public - * @param array $alias 别名定义 - * @return $this - */ - public function setAlias($alias) - { - $this->alias = $alias; - return $this; - } - - /** - * HAS ONE 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 关联主键 - * @param array $alias 别名定义 - * @param string $joinType JOIN类型 - * @return $this - */ - public function hasOne($model, $foreignKey, $localKey, $alias = [], $joinType = 'INNER') - { - $this->type = self::HAS_ONE; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $localKey; - $this->alias = $alias; - $this->joinType = $joinType; - $this->query = (new $model)->db(); - // 返回关联的模型对象 - return $this; - } - - /** - * BELONGS TO 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $otherKey 关联主键 - * @param array $alias 别名定义 - * @param string $joinType JOIN类型 - * @return $this - */ - public function belongsTo($model, $foreignKey, $otherKey, $alias = [], $joinType = 'INNER') - { - // 记录当前关联信息 - $this->type = self::BELONGS_TO; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $otherKey; - $this->alias = $alias; - $this->joinType = $joinType; - $this->query = (new $model)->db(); - // 返回关联的模型对象 - return $this; - } - - /** - * HAS MANY 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 关联主键 - * @param array $alias 别名定义 - * @return $this - */ - public function hasMany($model, $foreignKey, $localKey, $alias) - { - // 记录当前关联信息 - $this->type = self::HAS_MANY; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $localKey; - $this->alias = $alias; - $this->query = (new $model)->db(); - // 返回关联的模型对象 - return $this; - } - - /** - * HAS MANY 远程关联定义 - * @access public - * @param string $model 模型名 - * @param string $through 中间模型名 - * @param string $firstkey 关联外键 - * @param string $secondKey 关联外键 - * @param string $localKey 关联主键 - * @param array $alias 别名定义 - * @return $this - */ - public function hasManyThrough($model, $through, $foreignKey, $throughKey, $localKey, $alias) - { - // 记录当前关联信息 - $this->type = self::HAS_MANY_THROUGH; - $this->model = $model; - $this->middle = $through; - $this->foreignKey = $foreignKey; - $this->throughKey = $throughKey; - $this->localKey = $localKey; - $this->alias = $alias; - $this->query = (new $model)->db(); - // 返回关联的模型对象 - return $this; - } - - /** - * BELONGS TO MANY 关联定义 - * @access public - * @param string $model 模型名 - * @param string $table 中间表名 - * @param string $foreignKey 关联模型外键 - * @param string $localKey 当前模型关联键 - * @param array $alias 别名定义 - * @return $this - */ - public function belongsToMany($model, $table, $foreignKey, $localKey, $alias) - { - // 记录当前关联信息 - $this->type = self::BELONGS_TO_MANY; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $localKey; - $this->middle = $table; - $this->alias = $alias; - $this->query = (new $model)->db(); - // 返回关联的模型对象 - return $this; - } - - /** - * BELONGS TO MANY 关联查询 - * @access public - * @param object $model 关联模型对象 - * @param string $table 中间表名 - * @param string $foreignKey 关联模型关联键 - * @param string $localKey 当前模型关联键 - * @param array $condition 关联查询条件 - * @return \think\db\Query|string - */ - protected function belongsToManyQuery($model, $table, $foreignKey, $localKey, $condition = []) - { - // 关联查询封装 - $tableName = $model->getTable(); - $relationFk = $model->getPk(); - return $model::field($tableName . '.*') - ->field(true, false, $table, 'pivot', 'pivot__') - ->join($table . ' pivot', 'pivot.' . $foreignKey . '=' . $tableName . '.' . $relationFk) - ->where($condition); - } - - /** - * 保存(新增)当前关联数据对象 - * @access public - * @param mixed $data 数据 可以使用数组 关联模型对象 和 关联对象的主键 - * @param array $pivot 中间表额外数据 - * @return integer - */ - public function save($data, array $pivot = []) - { - // 判断关联类型 - switch ($this->type) { - case self::HAS_ONE: - case self::BELONGS_TO: - case self::HAS_MANY: - if ($data instanceof Model) { - $data = $data->getData(); - } - // 保存关联表数据 - $data[$this->foreignKey] = $this->parent->{$this->localKey}; - $model = new $this->model; - return $model->save($data); - case self::BELONGS_TO_MANY: - // 保存关联表/中间表数据 - return $this->attach($data, $pivot); - } - } - - /** - * 批量保存当前关联数据对象 - * @access public - * @param array $dataSet 数据集 - * @param array $pivot 中间表额外数据 - * @return integer - */ - public function saveAll(array $dataSet, array $pivot = []) - { - $result = false; - foreach ($dataSet as $key => $data) { - // 判断关联类型 - switch ($this->type) { - case self::HAS_MANY: - $data[$this->foreignKey] = $this->parent->{$this->localKey}; - $result = $this->save($data); - break; - case self::BELONGS_TO_MANY: - // TODO - $result = $this->attach($data, !empty($pivot) ? $pivot[$key] : []); - break; - } - } - return $result; - } - - /** - * 附加关联的一个中间表数据 - * @access public - * @param mixed $data 数据 可以使用数组、关联模型对象 或者 关联对象的主键 - * @param array $pivot 中间表额外数据 - * @return integer - */ - public function attach($data, $pivot = []) - { - if (is_array($data)) { - // 保存关联表数据 - $model = new $this->model; - $model->save($data); - $id = $model->getLastInsID(); - } elseif (is_numeric($data) || is_string($data)) { - // 根据关联表主键直接写入中间表 - $id = $data; - } elseif ($data instanceof Model) { - // 根据关联表主键直接写入中间表 - $relationFk = $data->getPk(); - $id = $data->$relationFk; - } - - if ($id) { - // 保存中间表数据 - $pk = $this->parent->getPk(); - $pivot[$this->localKey] = $this->parent->$pk; - $pivot[$this->foreignKey] = $id; - $query = clone $this->parent->db(); - return $query->table($this->middle)->insert($pivot); - } else { - throw new Exception('miss relation data'); - } - } - - /** - * 解除关联的一个中间表数据 - * @access public - * @param integer|array $data 数据 可以使用关联对象的主键 - * @param bool $relationDel 是否同时删除关联表数据 - * @return integer - */ - public function detach($data, $relationDel = false) - { - if (is_array($data)) { - $id = $data; - } elseif (is_numeric($data) || is_string($data)) { - // 根据关联表主键直接写入中间表 - $id = $data; - } elseif ($data instanceof Model) { - // 根据关联表主键直接写入中间表 - $relationFk = $data->getPk(); - $id = $data->$relationFk; - } - // 删除中间表数据 - $pk = $this->parent->getPk(); - $pivot[$this->localKey] = $this->parent->$pk; - if (isset($id)) { - $pivot[$this->foreignKey] = is_array($id) ? ['in', $id] : $id; - } - $query = clone $this->parent->db(); - $query->table($this->middle)->where($pivot)->delete(); - - // 删除关联表数据 - if (isset($id) && $relationDel) { - $model = $this->model; - $model::destroy($id); - } - } - - public function __call($method, $args) - { - if ($this->query) { - switch ($this->type) { - case self::HAS_MANY: - if (isset($this->where)) { - $this->query->where($this->where); - } elseif (isset($this->parent->{$this->localKey})) { - // 关联查询带入关联条件 - $this->query->where($this->foreignKey, $this->parent->{$this->localKey}); - } - break; - case self::HAS_MANY_THROUGH: - $through = $this->middle; - $model = $this->model; - $alias = Loader::parseName(basename(str_replace('\\', '/', $model))); - $throughTable = $through::getTable(); - $pk = (new $this->model)->getPk(); - $throughKey = $this->throughKey; - $modelTable = $this->parent->getTable(); - $this->query->field($alias . '.*')->alias($alias) - ->join($throughTable, $throughTable . '.' . $pk . '=' . $alias . '.' . $throughKey) - ->join($modelTable, $modelTable . '.' . $this->localKey . '=' . $throughTable . '.' . $this->foreignKey) - ->where($throughTable . '.' . $this->foreignKey, $this->parent->{$this->localKey}); - break; - case self::BELONGS_TO_MANY: - // TODO - - } - $result = call_user_func_array([$this->query, $method], $args); - if ($result instanceof \think\db\Query) { - $this->option = $result->getOptions(); - return $this; - } else { - $this->option = []; - return $result; - } - } else { - throw new Exception('method not exists:' . __CLASS__ . '->' . $method); - } - } - -} diff --git a/thinkphp/library/think/paginator/Collection.php b/thinkphp/library/think/paginator/Collection.php deleted file mode 100755 index 82e8827..0000000 --- a/thinkphp/library/think/paginator/Collection.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: zhangyajun <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\paginator; - -use Exception; -use think\Paginator; - -/** - * Class Collection - * @package think\paginator - * @method integer total() - * @method integer listRows() - * @method integer currentPage() - * @method string render() - * @method Paginator fragment($fragment) - * @method Paginator appends($key, $value) - * @method integer lastPage() - * @method boolean hasPages() - */ -class Collection extends \think\Collection -{ - - /** @var Paginator */ - protected $paginator; - - public function __construct($items = [], Paginator $paginator = null) - { - $this->paginator = $paginator; - parent::__construct($items); - } - - public static function make($items = [], Paginator $paginator = null) - { - return new static($items, $paginator); - } - - public function toArray() - { - if ($this->paginator) { - try { - $total = $this->total(); - } catch (Exception $e) { - $total = null; - } - - return [ - 'total' => $total, - 'per_page' => $this->listRows(), - 'current_page' => $this->currentPage(), - 'data' => parent::toArray() - ]; - } else { - return parent::toArray(); - } - } - - public function __call($method, $args) - { - if ($this->paginator && method_exists($this->paginator, $method)) { - return call_user_func_array([$this->paginator, $method], $args); - } else { - throw new Exception('method not exists:' . __CLASS__ . '->' . $method); - } - } -} \ No newline at end of file diff --git a/thinkphp/library/think/paginator/driver/Bootstrap.php b/thinkphp/library/think/paginator/driver/Bootstrap.php deleted file mode 100755 index 87e1fe4..0000000 --- a/thinkphp/library/think/paginator/driver/Bootstrap.php +++ /dev/null @@ -1,207 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: zhangyajun <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\paginator\driver; - -use think\Paginator; - -class Bootstrap extends Paginator -{ - - /** - * 上一页按钮 - * @param string $text - * @return string - */ - protected function getPreviousButton($text = "«") - { - - if ($this->currentPage() <= 1) { - return $this->getDisabledTextWrapper($text); - } - - $url = $this->url( - $this->currentPage() - 1 - ); - - return $this->getPageLinkWrapper($url, $text); - } - - /** - * 下一页按钮 - * @param string $text - * @return string - */ - protected function getNextButton($text = '»') - { - if (!$this->hasMore) { - return $this->getDisabledTextWrapper($text); - } - - $url = $this->url($this->currentPage() + 1); - - return $this->getPageLinkWrapper($url, $text); - } - - /** - * 页码按钮 - * @return string - */ - protected function getLinks() - { - if ($this->simple) - return ''; - - $block = [ - 'first' => null, - 'slider' => null, - 'last' => null - ]; - - $side = 3; - $window = $side * 2; - - if ($this->lastPage < $window + 6) { - $block['first'] = $this->getUrlRange(1, $this->lastPage); - } elseif ($this->currentPage <= $window) { - $block['first'] = $this->getUrlRange(1, $window + 2); - $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage); - } elseif ($this->currentPage > ($this->lastPage - $window)) { - $block['first'] = $this->getUrlRange(1, 2); - $block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage); - } else { - $block['first'] = $this->getUrlRange(1, 2); - $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side); - $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage); - } - - $html = ''; - - if (is_array($block['first'])) { - $html .= $this->getUrlLinks($block['first']); - } - - if (is_array($block['slider'])) { - $html .= $this->getDots(); - $html .= $this->getUrlLinks($block['slider']); - } - - if (is_array($block['last'])) { - $html .= $this->getDots(); - $html .= $this->getUrlLinks($block['last']); - } - - return $html; - } - - - /** - * 渲染分页html - * @return mixed - */ - public function render() - { - if ($this->hasPages()) { - if ($this->simple) { - return sprintf( - '<ul class="pager">%s %s</ul>', - $this->getPreviousButton(), - $this->getNextButton() - ); - } else { - return sprintf( - '<ul class="pagination">%s %s %s</ul>', - $this->getPreviousButton(), - $this->getLinks(), - $this->getNextButton() - ); - } - } - } - - - /** - * 生成一个可点击的按钮 - * - * @param string $url - * @param int $page - * @return string - */ - protected function getAvailablePageWrapper($url, $page) - { - return '<li><a href="' . htmlentities($url) . '">' . $page . '</a></li>'; - } - - /** - * 生成一个禁用的按钮 - * - * @param string $text - * @return string - */ - protected function getDisabledTextWrapper($text) - { - return '<li class="disabled"><span>' . $text . '</span></li>'; - } - - /** - * 生成一个激活的按钮 - * - * @param string $text - * @return string - */ - protected function getActivePageWrapper($text) - { - return '<li class="active"><span>' . $text . '</span></li>'; - } - - /** - * 生成省略号按钮 - * - * @return string - */ - protected function getDots() - { - return $this->getDisabledTextWrapper('...'); - } - - /** - * 批量生成页码按钮. - * - * @param array $urls - * @return string - */ - protected function getUrlLinks(array $urls) - { - $html = ''; - - foreach ($urls as $page => $url) { - $html .= $this->getPageLinkWrapper($url, $page); - } - - return $html; - } - - /** - * 生成普通页码按钮 - * - * @param string $url - * @param int $page - * @return string - */ - protected function getPageLinkWrapper($url, $page) - { - if ($page == $this->currentPage()) { - return $this->getActivePageWrapper($page); - } - - return $this->getAvailablePageWrapper($url, $page); - } -} \ No newline at end of file diff --git a/thinkphp/library/think/process/Builder.php b/thinkphp/library/think/process/Builder.php deleted file mode 100755 index 826e674..0000000 --- a/thinkphp/library/think/process/Builder.php +++ /dev/null @@ -1,234 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\process; - -use think\Process; - -class Builder -{ - - private $arguments; - private $cwd; - private $env = null; - private $input; - private $timeout = 60; - private $options = []; - private $inheritEnv = true; - private $prefix = []; - private $outputDisabled = false; - - /** - * 构造方法 - * @param string[] $arguments 参数 - */ - public function __construct(array $arguments = []) - { - $this->arguments = $arguments; - } - - /** - * 创建一个实例 - * @param string[] $arguments 参数 - * @return self - */ - public static function create(array $arguments = []) - { - return new static($arguments); - } - - /** - * 添加一个参数 - * @param string $argument 参数 - * @return self - */ - public function add($argument) - { - $this->arguments[] = $argument; - - return $this; - } - - /** - * 添加一个前缀 - * @param string|array $prefix - * @return self - */ - public function setPrefix($prefix) - { - $this->prefix = is_array($prefix) ? $prefix : [$prefix]; - - return $this; - } - - /** - * 设置参数 - * @param string[] $arguments - * @return self - */ - public function setArguments(array $arguments) - { - $this->arguments = $arguments; - - return $this; - } - - /** - * 设置工作目录 - * @param null|string $cwd - * @return self - */ - public function setWorkingDirectory($cwd) - { - $this->cwd = $cwd; - - return $this; - } - - /** - * 是否初始化环境变量 - * @param bool $inheritEnv - * @return self - */ - public function inheritEnvironmentVariables($inheritEnv = true) - { - $this->inheritEnv = $inheritEnv; - - return $this; - } - - /** - * 设置环境变量 - * @param string $name - * @param null|string $value - * @return self - */ - public function setEnv($name, $value) - { - $this->env[$name] = $value; - - return $this; - } - - /** - * 添加环境变量 - * @param array $variables - * @return self - */ - public function addEnvironmentVariables(array $variables) - { - $this->env = array_replace($this->env, $variables); - - return $this; - } - - /** - * 设置输入 - * @param mixed $input - * @return self - */ - public function setInput($input) - { - $this->input = Utils::validateInput(sprintf('%s::%s', __CLASS__, __FUNCTION__), $input); - - return $this; - } - - /** - * 设置超时时间 - * @param float|null $timeout - * @return self - */ - public function setTimeout($timeout) - { - if (null === $timeout) { - $this->timeout = null; - - return $this; - } - - $timeout = (float)$timeout; - - if ($timeout < 0) { - throw new \InvalidArgumentException('The timeout value must be a valid positive integer or float number.'); - } - - $this->timeout = $timeout; - - return $this; - } - - /** - * 设置proc_open选项 - * @param string $name - * @param string $value - * @return self - */ - public function setOption($name, $value) - { - $this->options[$name] = $value; - - return $this; - } - - /** - * 禁止输出 - * @return self - */ - public function disableOutput() - { - $this->outputDisabled = true; - - return $this; - } - - /** - * 开启输出 - * @return self - */ - public function enableOutput() - { - $this->outputDisabled = false; - - return $this; - } - - /** - * 创建一个Process实例 - * @return Process - */ - public function getProcess() - { - if (0 === count($this->prefix) && 0 === count($this->arguments)) { - throw new \LogicException('You must add() command arguments before calling getProcess().'); - } - - $options = $this->options; - - $arguments = array_merge($this->prefix, $this->arguments); - $script = implode(' ', array_map([__NAMESPACE__ . '\\Utils', 'escapeArgument'], $arguments)); - - if ($this->inheritEnv) { - // include $_ENV for BC purposes - $env = array_replace($_ENV, $_SERVER, $this->env); - } else { - $env = $this->env; - } - - $process = new Process($script, $this->cwd, $env, $this->input, $this->timeout, $options); - - if ($this->outputDisabled) { - $process->disableOutput(); - } - - return $process; - } -} \ No newline at end of file diff --git a/thinkphp/library/think/process/Utils.php b/thinkphp/library/think/process/Utils.php deleted file mode 100755 index 3ed136a..0000000 --- a/thinkphp/library/think/process/Utils.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | TopThink [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2015 http://www.topthink.com All rights reserved. -// +---------------------------------------------------------------------- -// | Author: zhangyajun <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\process; - -class Utils -{ - - /** - * 转义字符串 - * @param string $argument - * @return string - */ - public static function escapeArgument($argument) - { - - if ('' === $argument) { - return escapeshellarg($argument); - } - $escapedArgument = ''; - $quote = false; - foreach (preg_split('/(")/i', $argument, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $part) { - if ('"' === $part) { - $escapedArgument .= '\\"'; - } elseif (self::isSurroundedBy($part, '%')) { - // Avoid environment variable expansion - $escapedArgument .= '^%"' . substr($part, 1, -1) . '"^%'; - } else { - // escape trailing backslash - if ('\\' === substr($part, -1)) { - $part .= '\\'; - } - $quote = true; - $escapedArgument .= $part; - } - } - if ($quote) { - $escapedArgument = '"' . $escapedArgument . '"'; - } - return $escapedArgument; - } - - /** - * 验证并进行规范化Process输入。 - * @param string $caller - * @param mixed $input - * @return string - * @throws \InvalidArgumentException - */ - public static function validateInput($caller, $input) - { - if (null !== $input) { - if (is_resource($input)) { - return $input; - } - if (is_scalar($input)) { - return (string)$input; - } - throw new \InvalidArgumentException(sprintf('%s only accepts strings or stream resources.', $caller)); - } - return $input; - } - - private static function isSurroundedBy($arg, $char) - { - return 2 < strlen($arg) && $char === $arg[0] && $char === $arg[strlen($arg) - 1]; - } - -} \ No newline at end of file diff --git a/thinkphp/library/think/process/exception/Faild.php b/thinkphp/library/think/process/exception/Faild.php deleted file mode 100755 index 23df369..0000000 --- a/thinkphp/library/think/process/exception/Faild.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\process\exception; - - -use think\Process; - -class Failed extends \RuntimeException -{ - - private $process; - - public function __construct(Process $process) - { - if ($process->isSuccessful()) { - throw new \InvalidArgumentException('Expected a failed process, but the given process was successful.'); - } - - $error = sprintf('The command "%s" failed.' . "\nExit Code: %s(%s)", $process->getCommandLine(), $process->getExitCode(), $process->getExitCodeText()); - - if (!$process->isOutputDisabled()) { - $error .= sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s", $process->getOutput(), $process->getErrorOutput()); - } - - parent::__construct($error); - - $this->process = $process; - } - - public function getProcess() - { - return $this->process; - } -} diff --git a/thinkphp/library/think/process/exception/Timeout.php b/thinkphp/library/think/process/exception/Timeout.php deleted file mode 100755 index c085ee8..0000000 --- a/thinkphp/library/think/process/exception/Timeout.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\process\exception; - -use think\Process; - -class Timeout extends \RuntimeException -{ - - const TYPE_GENERAL = 1; - const TYPE_IDLE = 2; - - private $process; - private $timeoutType; - - public function __construct(Process $process, $timeoutType) - { - $this->process = $process; - $this->timeoutType = $timeoutType; - - parent::__construct(sprintf('The process "%s" exceeded the timeout of %s seconds.', $process->getCommandLine(), $this->getExceededTimeout())); - } - - public function getProcess() - { - return $this->process; - } - - public function isGeneralTimeout() - { - return $this->timeoutType === self::TYPE_GENERAL; - } - - public function isIdleTimeout() - { - return $this->timeoutType === self::TYPE_IDLE; - } - - public function getExceededTimeout() - { - switch ($this->timeoutType) { - case self::TYPE_GENERAL: - return $this->process->getTimeout(); - - case self::TYPE_IDLE: - return $this->process->getIdleTimeout(); - - default: - throw new \LogicException(sprintf('Unknown timeout type "%d".', $this->timeoutType)); - } - } -} \ No newline at end of file diff --git a/thinkphp/library/think/process/pipes/Pipes.php b/thinkphp/library/think/process/pipes/Pipes.php deleted file mode 100755 index 51da44f..0000000 --- a/thinkphp/library/think/process/pipes/Pipes.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\process\pipes; - -abstract class Pipes -{ - - /** @var array */ - public $pipes = []; - - /** @var string */ - protected $inputBuffer = ''; - /** @var resource|null */ - protected $input; - - /** @var bool */ - private $blocked = true; - - const CHUNK_SIZE = 16384; - - /** - * 返回用于 proc_open 描述符的数组 - * @return array - */ - abstract public function getDescriptors(); - - /** - * 返回一个数组的索引由其相关的流,以防这些管道使用的临时文件的文件名。 - * @return string[] - */ - abstract public function getFiles(); - - /** - * 文件句柄和管道中读取数据。 - * @param bool $blocking 是否使用阻塞调用 - * @param bool $close 是否要关闭管道,如果他们已经到达 EOF。 - * @return string[] - */ - abstract public function readAndWrite($blocking, $close = false); - - /** - * 返回当前状态如果有打开的文件句柄或管道。 - * @return bool - */ - abstract public function areOpen(); - - - /** - * {@inheritdoc} - */ - public function close() - { - foreach ($this->pipes as $pipe) { - fclose($pipe); - } - $this->pipes = []; - } - - /** - * 检查系统调用已被中断 - * @return bool - */ - protected function hasSystemCallBeenInterrupted() - { - $lastError = error_get_last(); - - return isset($lastError['message']) && false !== stripos($lastError['message'], 'interrupted system call'); - } - - protected function unblock() - { - if (!$this->blocked) { - return; - } - - foreach ($this->pipes as $pipe) { - stream_set_blocking($pipe, 0); - } - if (null !== $this->input) { - stream_set_blocking($this->input, 0); - } - - $this->blocked = false; - } -} \ No newline at end of file diff --git a/thinkphp/library/think/process/pipes/Unix.php b/thinkphp/library/think/process/pipes/Unix.php deleted file mode 100755 index abfe61b..0000000 --- a/thinkphp/library/think/process/pipes/Unix.php +++ /dev/null @@ -1,196 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\process\pipes; - -use think\Process; - -class Unix extends Pipes -{ - - /** @var bool */ - private $ttyMode; - /** @var bool */ - private $ptyMode; - /** @var bool */ - private $disableOutput; - - public function __construct($ttyMode, $ptyMode, $input, $disableOutput) - { - $this->ttyMode = (bool)$ttyMode; - $this->ptyMode = (bool)$ptyMode; - $this->disableOutput = (bool)$disableOutput; - - if (is_resource($input)) { - $this->input = $input; - } else { - $this->inputBuffer = (string)$input; - } - } - - public function __destruct() - { - $this->close(); - } - - /** - * {@inheritdoc} - */ - public function getDescriptors() - { - if ($this->disableOutput) { - $nullstream = fopen('/dev/null', 'c'); - - return [ - ['pipe', 'r'], - $nullstream, - $nullstream, - ]; - } - - if ($this->ttyMode) { - return [ - ['file', '/dev/tty', 'r'], - ['file', '/dev/tty', 'w'], - ['file', '/dev/tty', 'w'], - ]; - } - - if ($this->ptyMode && Process::isPtySupported()) { - return [ - ['pty'], - ['pty'], - ['pty'], - ]; - } - - return [ - ['pipe', 'r'], - ['pipe', 'w'], // stdout - ['pipe', 'w'], // stderr - ]; - } - - /** - * {@inheritdoc} - */ - public function getFiles() - { - return []; - } - - /** - * {@inheritdoc} - */ - public function readAndWrite($blocking, $close = false) - { - - if (1 === count($this->pipes) && [0] === array_keys($this->pipes)) { - fclose($this->pipes[0]); - unset($this->pipes[0]); - } - - if (empty($this->pipes)) { - return []; - } - - $this->unblock(); - - $read = []; - - if (null !== $this->input) { - $r = array_merge($this->pipes, ['input' => $this->input]); - } else { - $r = $this->pipes; - } - - unset($r[0]); - - $w = isset($this->pipes[0]) ? [$this->pipes[0]] : null; - $e = null; - - if (false === $n = @stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) { - - if (!$this->hasSystemCallBeenInterrupted()) { - $this->pipes = []; - } - - return $read; - } - - if (0 === $n) { - return $read; - } - - foreach ($r as $pipe) { - - $type = (false !== $found = array_search($pipe, $this->pipes)) ? $found : 'input'; - $data = ''; - while ('' !== $dataread = (string)fread($pipe, self::CHUNK_SIZE)) { - $data .= $dataread; - } - - if ('' !== $data) { - if ($type === 'input') { - $this->inputBuffer .= $data; - } else { - $read[$type] = $data; - } - } - - if (false === $data || (true === $close && feof($pipe) && '' === $data)) { - if ($type === 'input') { - $this->input = null; - } else { - fclose($this->pipes[$type]); - unset($this->pipes[$type]); - } - } - } - - if (null !== $w && 0 < count($w)) { - while (strlen($this->inputBuffer)) { - $written = fwrite($w[0], $this->inputBuffer, 2 << 18); // write 512k - if ($written > 0) { - $this->inputBuffer = (string)substr($this->inputBuffer, $written); - } else { - break; - } - } - } - - if ('' === $this->inputBuffer && null === $this->input && isset($this->pipes[0])) { - fclose($this->pipes[0]); - unset($this->pipes[0]); - } - - return $read; - } - - /** - * {@inheritdoc} - */ - public function areOpen() - { - return (bool)$this->pipes; - } - - /** - * 创建一个新的 UnixPipes 实例 - * @param Process $process - * @param string|resource $input - * @return self - */ - public static function create(Process $process, $input) - { - return new static($process->isTty(), $process->isPty(), $input, $process->isOutputDisabled()); - } -} \ No newline at end of file diff --git a/thinkphp/library/think/process/pipes/Windows.php b/thinkphp/library/think/process/pipes/Windows.php deleted file mode 100755 index 2cc44ca..0000000 --- a/thinkphp/library/think/process/pipes/Windows.php +++ /dev/null @@ -1,228 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: yunwuxin <448901948@qq.com> -// +---------------------------------------------------------------------- - -namespace think\process\pipes; - -use think\Process; - -class Windows extends Pipes -{ - - /** @var array */ - private $files = []; - /** @var array */ - private $fileHandles = []; - /** @var array */ - private $readBytes = [ - Process::STDOUT => 0, - Process::STDERR => 0, - ]; - /** @var bool */ - private $disableOutput; - - public function __construct($disableOutput, $input) - { - $this->disableOutput = (bool)$disableOutput; - - if (!$this->disableOutput) { - - $this->files = [ - Process::STDOUT => tempnam(sys_get_temp_dir(), 'sf_proc_stdout'), - Process::STDERR => tempnam(sys_get_temp_dir(), 'sf_proc_stderr'), - ]; - foreach ($this->files as $offset => $file) { - $this->fileHandles[$offset] = fopen($this->files[$offset], 'rb'); - if (false === $this->fileHandles[$offset]) { - throw new \RuntimeException('A temporary file could not be opened to write the process output to, verify that your TEMP environment variable is writable'); - } - } - } - - if (is_resource($input)) { - $this->input = $input; - } else { - $this->inputBuffer = $input; - } - } - - public function __destruct() - { - $this->close(); - $this->removeFiles(); - } - - /** - * {@inheritdoc} - */ - public function getDescriptors() - { - if ($this->disableOutput) { - $nullstream = fopen('NUL', 'c'); - - return [ - ['pipe', 'r'], - $nullstream, - $nullstream, - ]; - } - - return [ - ['pipe', 'r'], - ['file', 'NUL', 'w'], - ['file', 'NUL', 'w'], - ]; - } - - /** - * {@inheritdoc} - */ - public function getFiles() - { - return $this->files; - } - - /** - * {@inheritdoc} - */ - public function readAndWrite($blocking, $close = false) - { - $this->write($blocking, $close); - - $read = []; - $fh = $this->fileHandles; - foreach ($fh as $type => $fileHandle) { - if (0 !== fseek($fileHandle, $this->readBytes[$type])) { - continue; - } - $data = ''; - $dataread = null; - while (!feof($fileHandle)) { - if (false !== $dataread = fread($fileHandle, self::CHUNK_SIZE)) { - $data .= $dataread; - } - } - if (0 < $length = strlen($data)) { - $this->readBytes[$type] += $length; - $read[$type] = $data; - } - - if (false === $dataread || (true === $close && feof($fileHandle) && '' === $data)) { - fclose($this->fileHandles[$type]); - unset($this->fileHandles[$type]); - } - } - - return $read; - } - - /** - * {@inheritdoc} - */ - public function areOpen() - { - return (bool)$this->pipes && (bool)$this->fileHandles; - } - - /** - * {@inheritdoc} - */ - public function close() - { - parent::close(); - foreach ($this->fileHandles as $handle) { - fclose($handle); - } - $this->fileHandles = []; - } - - /** - * 创建一个新的 WindowsPipes 实例。 - * @param Process $process - * @param $input - * @return self - */ - public static function create(Process $process, $input) - { - return new static($process->isOutputDisabled(), $input); - } - - /** - * 删除临时文件 - */ - private function removeFiles() - { - foreach ($this->files as $filename) { - if (file_exists($filename)) { - @unlink($filename); - } - } - $this->files = []; - } - - /** - * 写入到 stdin 输入 - * @param bool $blocking - * @param bool $close - */ - private function write($blocking, $close) - { - if (empty($this->pipes)) { - return; - } - - $this->unblock(); - - $r = null !== $this->input ? ['input' => $this->input] : null; - $w = isset($this->pipes[0]) ? [$this->pipes[0]] : null; - $e = null; - - if (false === $n = @stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) { - if (!$this->hasSystemCallBeenInterrupted()) { - $this->pipes = []; - } - - return; - } - - if (0 === $n) { - return; - } - - if (null !== $w && 0 < count($r)) { - $data = ''; - while ($dataread = fread($r['input'], self::CHUNK_SIZE)) { - $data .= $dataread; - } - - $this->inputBuffer .= $data; - - if (false === $data || (true === $close && feof($r['input']) && '' === $data)) { - $this->input = null; - } - } - - if (null !== $w && 0 < count($w)) { - while (strlen($this->inputBuffer)) { - $written = fwrite($w[0], $this->inputBuffer, 2 << 18); - if ($written > 0) { - $this->inputBuffer = (string)substr($this->inputBuffer, $written); - } else { - break; - } - } - } - - if ('' === $this->inputBuffer && null === $this->input && isset($this->pipes[0])) { - fclose($this->pipes[0]); - unset($this->pipes[0]); - } - } -} \ No newline at end of file diff --git a/thinkphp/library/think/response/Json.php b/thinkphp/library/think/response/Json.php deleted file mode 100755 index 027aa2a..0000000 --- a/thinkphp/library/think/response/Json.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\response; - -use think\Response; - -class Json extends Response -{ - // 输出参数 - protected $options = [ - 'json_encode_param' => JSON_UNESCAPED_UNICODE, - ]; - - protected $contentType = 'application/json'; - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - * @throws \Exception - */ - protected function output($data) - { - try { - // 返回JSON数据格式到客户端 包含状态信息 - $data = json_encode($data, $this->options['json_encode_param']); - - if ($data === false) { - throw new \InvalidArgumentException(json_last_error_msg()); - } - - return $data; - } catch (\Exception $e) { - if ($e->getPrevious()) { - throw $e->getPrevious(); - } - throw $e; - } - } - -} diff --git a/thinkphp/library/think/response/Jsonp.php b/thinkphp/library/think/response/Jsonp.php deleted file mode 100755 index b92aa9f..0000000 --- a/thinkphp/library/think/response/Jsonp.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\response; - -use think\Request; -use think\Response; - -class Jsonp extends Response -{ - // 输出参数 - protected $options = [ - 'var_jsonp_handler' => 'callback', - 'default_jsonp_handler' => 'jsonpReturn', - 'json_encode_param' => JSON_UNESCAPED_UNICODE, - ]; - - protected $contentType = 'application/javascript'; - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - * @throws \Exception - */ - protected function output($data) - { - try { - // 返回JSON数据格式到客户端 包含状态信息 [当url_common_param为false时是无法获取到$_GET的数据的,故使用Request来获取<xiaobo.sun@qq.com>] - $var_jsonp_handler = Request::instance()->param($this->options['var_jsonp_handler'], ""); - $handler = !empty($var_jsonp_handler) ? $var_jsonp_handler : $this->options['default_jsonp_handler']; - - $data = json_encode($data, $this->options['json_encode_param']); - - if ($data === false) { - throw new \InvalidArgumentException(json_last_error_msg()); - } - - $data = $handler . '(' . $data . ');'; - return $data; - } catch (\Exception $e) { - if ($e->getPrevious()) { - throw $e->getPrevious(); - } - throw $e; - } - } - -} diff --git a/thinkphp/library/think/response/Redirect.php b/thinkphp/library/think/response/Redirect.php deleted file mode 100755 index 0d65e5e..0000000 --- a/thinkphp/library/think/response/Redirect.php +++ /dev/null @@ -1,97 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\response; - -use think\Request; -use think\Response; -use think\Session; -use think\Url; - -class Redirect extends Response -{ - - protected $options = []; - - // URL参数 - protected $params = []; - - public function __construct($data = '', $code = 302, array $header = [], array $options = []) - { - parent::__construct($data, $code, $header, $options); - $this->cacheControl('no-cache,must-revalidate'); - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - */ - protected function output($data) - { - $this->header['Location'] = $this->getTargetUrl(); - return; - } - - /** - * 重定向传值(通过Session) - * @access protected - * @param string|array $name 变量名或者数组 - * @param mixed $value 值 - * @return $this - */ - public function with($name, $value = null) - { - if (is_array($name)) { - foreach ($name as $key => $val) { - Session::flash($key, $val); - } - } else { - Session::flash($name, $value); - } - return $this; - } - - /** - * 获取跳转地址 - * @return string - */ - public function getTargetUrl() - { - return (strpos($this->data, '://') || 0 === strpos($this->data, '/')) ? $this->data : Url::build($this->data, $this->params); - } - - public function params($params = []) - { - $this->params = $params; - return $this; - } - - /** - * 记住当前url后跳转 - */ - public function remember() - { - Session::set('redirect_url', Request::instance()->url()); - } - - /** - * 跳转到上次记住的url - */ - public function restore() - { - if (Session::has('redirect_url')) { - $this->data = Session::get('redirect_url'); - Session::delete('redirect_url'); - } - } -} diff --git a/thinkphp/library/think/response/View.php b/thinkphp/library/think/response/View.php deleted file mode 100755 index 3a5f366..0000000 --- a/thinkphp/library/think/response/View.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\response; - -use think\Config; -use think\Response; -use think\View as ViewTemplate; - -class View extends Response -{ - // 输出参数 - protected $options = []; - protected $vars = []; - protected $replace = []; - protected $contentType = 'text/html'; - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - */ - protected function output($data) - { - // 渲染模板输出 - return ViewTemplate::instance(Config::get('template'), Config::get('view_replace_str')) - ->fetch($data, $this->vars, $this->replace); - } - - /** - * 获取视图变量 - * @access public - * @param string $name 模板变量 - * @return mixed - */ - public function getVars($name = null) - { - if (is_null($name)) { - return $this->vars; - } else { - return isset($this->vars[$name]) ? $this->vars[$name] : null; - } - } - - /** - * 模板变量赋值 - * @access public - * @param mixed $name 变量名 - * @param mixed $value 变量值 - * @return $this - */ - public function assign($name, $value = '') - { - if (is_array($name)) { - $this->vars = array_merge($this->vars, $name); - return $this; - } else { - $this->vars[$name] = $value; - } - return $this; - } - - /** - * 视图内容替换 - * @access public - * @param string|array $content 被替换内容(支持批量替换) - * @param string $replace 替换内容 - * @return $this - */ - public function replace($content, $replace = '') - { - if (is_array($content)) { - $this->replace = array_merge($this->replace, $content); - } else { - $this->replace[$content] = $replace; - } - return $this; - } - -} diff --git a/thinkphp/library/think/response/Xml.php b/thinkphp/library/think/response/Xml.php deleted file mode 100755 index 3a2c59b..0000000 --- a/thinkphp/library/think/response/Xml.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\response; - -use think\Response; - -class Xml extends Response -{ - // 输出参数 - protected $options = [ - // 根节点名 - 'root_node' => 'think', - // 根节点属性 - 'root_attr' => '', - //数字索引的子节点名 - 'item_node' => 'item', - // 数字索引子节点key转换的属性名 - 'item_key' => 'id', - // 数据编码 - 'encoding' => 'utf-8', - ]; - - protected $contentType = 'text/xml'; - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - */ - protected function output($data) - { - // XML数据转换 - return $this->xmlEncode($data, $this->options['root_node'], $this->options['item_node'], $this->options['root_attr'], $this->options['item_key'], $this->options['encoding']); - } - - /** - * XML编码 - * @param mixed $data 数据 - * @param string $root 根节点名 - * @param string $item 数字索引的子节点名 - * @param string $attr 根节点属性 - * @param string $id 数字索引子节点key转换的属性名 - * @param string $encoding 数据编码 - * @return string - */ - protected function xmlEncode($data, $root, $item, $attr, $id, $encoding) - { - if (is_array($attr)) { - $array = []; - foreach ($attr as $key => $value) { - $array[] = "{$key}=\"{$value}\""; - } - $attr = implode(' ', $array); - } - $attr = trim($attr); - $attr = empty($attr) ? '' : " {$attr}"; - $xml = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>"; - $xml .= "<{$root}{$attr}>"; - $xml .= $this->dataToXml($data, $item, $id); - $xml .= "</{$root}>"; - return $xml; - } - - /** - * 数据XML编码 - * @param mixed $data 数据 - * @param string $item 数字索引时的节点名称 - * @param string $id 数字索引key转换为的属性名 - * @return string - */ - protected function dataToXml($data, $item, $id) - { - $xml = $attr = ''; - foreach ($data as $key => $val) { - if (is_numeric($key)) { - $id && $attr = " {$id}=\"{$key}\""; - $key = $item; - } - $xml .= "<{$key}{$attr}>"; - $xml .= (is_array($val) || is_object($val)) ? $this->dataToXml($val, $item, $id) : $val; - $xml .= "</{$key}>"; - } - return $xml; - } -} diff --git a/thinkphp/library/think/session/driver/Memcache.php b/thinkphp/library/think/session/driver/Memcache.php deleted file mode 100755 index 2c04027..0000000 --- a/thinkphp/library/think/session/driver/Memcache.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\session\driver; - -use SessionHandler; -use think\Exception; - -class Memcache extends SessionHandler -{ - protected $handler = null; - protected $config = [ - 'host' => '127.0.0.1', // memcache主机 - 'port' => 11211, // memcache端口 - 'expire' => 3600, // session有效期 - 'timeout' => 0, // 连接超时时间(单位:毫秒) - 'persistent' => true, // 长连接 - 'session_name' => '', // memcache key前缀 - ]; - - public function __construct($config = []) - { - $this->config = array_merge($this->config, $config); - } - - /** - * 打开Session - * @access public - * @param string $savePath - * @param mixed $sessName - */ - public function open($savePath, $sessName) - { - // 检测php环境 - if (!extension_loaded('memcache')) { - throw new Exception('not support:memcache'); - } - $this->handler = new \Memcache; - // 支持集群 - $hosts = explode(',', $this->config['host']); - $ports = explode(',', $this->config['port']); - if (empty($ports[0])) { - $ports[0] = 11211; - } - // 建立连接 - foreach ((array) $hosts as $i => $host) { - $port = isset($ports[$i]) ? $ports[$i] : $ports[0]; - $this->config['timeout'] > 0 ? - $this->handler->addServer($host, $port, $this->config['persistent'], 1, $this->config['timeout']) : - $this->handler->addServer($host, $port, $this->config['persistent'], 1); - } - return true; - } - - /** - * 关闭Session - * @access public - */ - public function close() - { - $this->gc(ini_get('session.gc_maxlifetime')); - $this->handler->close(); - $this->handler = null; - return true; - } - - /** - * 读取Session - * @access public - * @param string $sessID - */ - public function read($sessID) - { - return $this->handler->get($this->config['session_name'] . $sessID); - } - - /** - * 写入Session - * @access public - * @param string $sessID - * @param String $sessData - */ - public function write($sessID, $sessData) - { - return $this->handler->set($this->config['session_name'] . $sessID, $sessData, 0, $this->config['expire']); - } - - /** - * 删除Session - * @access public - * @param string $sessID - */ - public function destroy($sessID) - { - return $this->handler->delete($this->config['session_name'] . $sessID); - } - - /** - * Session 垃圾回收 - * @access public - * @param string $sessMaxLifeTime - */ - public function gc($sessMaxLifeTime) - { - return true; - } -} diff --git a/thinkphp/library/think/session/driver/Memcached.php b/thinkphp/library/think/session/driver/Memcached.php deleted file mode 100755 index 4187204..0000000 --- a/thinkphp/library/think/session/driver/Memcached.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\session\driver; - -use SessionHandler; -use think\Exception; - -class Memcached extends SessionHandler -{ - protected $handler = null; - protected $config = [ - 'host' => '127.0.0.1', // memcache主机 - 'port' => 11211, // memcache端口 - 'expire' => 3600, // session有效期 - 'timeout' => 0, // 连接超时时间(单位:毫秒) - 'session_name' => '', // memcache key前缀 - 'username' => '', //账号 - 'password' => '', //密码 - ]; - - public function __construct($config = []) - { - $this->config = array_merge($this->config, $config); - } - - /** - * 打开Session - * @access public - * @param string $savePath - * @param mixed $sessName - */ - public function open($savePath, $sessName) - { - // 检测php环境 - if (!extension_loaded('memcached')) { - throw new Exception('not support:memcached'); - } - $this->handler = new \Memcached; - // 设置连接超时时间(单位:毫秒) - if ($this->config['timeout'] > 0) { - $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->config['timeout']); - } - // 支持集群 - $hosts = explode(',', $this->config['host']); - $ports = explode(',', $this->config['port']); - if (empty($ports[0])) { - $ports[0] = 11211; - } - // 建立连接 - $servers = []; - foreach ((array) $hosts as $i => $host) { - $servers[] = [$host, (isset($ports[$i]) ? $ports[$i] : $ports[0]), 1]; - } - $this->handler->addServers($servers); - if ('' != $this->config['username']) { - $this->handler->setOption(\Memcached::OPT_BINARY_PROTOCOL, true); - $this->handler->setSaslAuthData($this->config['username'], $this->config['password']); - } - return true; - } - - /** - * 关闭Session - * @access public - */ - public function close() - { - $this->gc(ini_get('session.gc_maxlifetime')); - $this->handler->quit(); - $this->handler = null; - return true; - } - - /** - * 读取Session - * @access public - * @param string $sessID - */ - public function read($sessID) - { - return $this->handler->get($this->config['session_name'] . $sessID); - } - - /** - * 写入Session - * @access public - * @param string $sessID - * @param String $sessData - */ - public function write($sessID, $sessData) - { - return $this->handler->set($this->config['session_name'] . $sessID, $sessData, $this->config['expire']); - } - - /** - * 删除Session - * @access public - * @param string $sessID - */ - public function destroy($sessID) - { - return $this->handler->delete($this->config['session_name'] . $sessID); - } - - /** - * Session 垃圾回收 - * @access public - * @param string $sessMaxLifeTime - */ - public function gc($sessMaxLifeTime) - { - return true; - } -} diff --git a/thinkphp/library/think/session/driver/Redis.php b/thinkphp/library/think/session/driver/Redis.php deleted file mode 100755 index e3dc998..0000000 --- a/thinkphp/library/think/session/driver/Redis.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\session\driver; - -use SessionHandler; -use think\Exception; - -class Redis extends SessionHandler -{ - /** @var \Redis */ - protected $handler = null; - protected $config = [ - 'host' => '127.0.0.1', // redis主机 - 'port' => 6379, // redis端口 - 'password' => '', // 密码 - 'select' => 0, // 操作库 - 'expire' => 3600, // 有效期(秒) - 'timeout' => 0, // 超时时间(秒) - 'persistent' => true, // 是否长连接 - 'session_name' => '', // sessionkey前缀 - ]; - - public function __construct($config = []) - { - $this->config = array_merge($this->config, $config); - } - - /** - * 打开Session - * @access public - * @param string $savePath - * @param mixed $sessName - * @return bool - * @throws Exception - */ - public function open($savePath, $sessName) - { - // 检测php环境 - if (!extension_loaded('redis')) { - throw new Exception('not support:redis'); - } - $this->handler = new \Redis; - - // 建立连接 - $func = $this->config['persistent'] ? 'pconnect' : 'connect'; - $this->handler->$func($this->config['host'], $this->config['port'], $this->config['timeout']); - - if ('' != $this->config['password']) { - $this->handler->auth($this->config['password']); - } - - if (0 != $this->config['select']) { - $this->handler->select($this->config['select']); - } - - return true; - } - - /** - * 关闭Session - * @access public - */ - public function close() - { - $this->gc(ini_get('session.gc_maxlifetime')); - $this->handler->close(); - $this->handler = null; - return true; - } - - /** - * 读取Session - * @access public - * @param string $sessID - * @return bool|string - */ - public function read($sessID) - { - return $this->handler->get($this->config['session_name'] . $sessID); - } - - /** - * 写入Session - * @access public - * @param string $sessID - * @param String $sessData - * @return bool - */ - public function write($sessID, $sessData) - { - if ($this->config['expire'] > 0) { - return $this->handler->setex($this->config['session_name'] . $sessID, $this->config['expire'], $sessData); - } else { - return $this->handler->set($this->config['session_name'] . $sessID, $sessData); - } - } - - /** - * 删除Session - * @access public - * @param string $sessID - * @return bool|void - */ - public function destroy($sessID) - { - $this->handler->delete($this->config['session_name'] . $sessID); - } - - /** - * Session 垃圾回收 - * @access public - * @param string $sessMaxLifeTime - * @return bool - */ - public function gc($sessMaxLifeTime) - { - return true; - } -} diff --git a/thinkphp/library/think/template/TagLib.php b/thinkphp/library/think/template/TagLib.php deleted file mode 100755 index 101593b..0000000 --- a/thinkphp/library/think/template/TagLib.php +++ /dev/null @@ -1,334 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\template; - -use think\Exception; - -/** - * ThinkPHP标签库TagLib解析基类 - * @category Think - * @package Think - * @subpackage Template - * @author liu21st <liu21st@gmail.com> - */ -class TagLib -{ - - /** - * 标签库定义XML文件 - * @var string - * @access protected - */ - protected $xml = ''; - protected $tags = []; // 标签定义 - /** - * 标签库名称 - * @var string - * @access protected - */ - protected $tagLib = ''; - - /** - * 标签库标签列表 - * @var array - * @access protected - */ - protected $tagList = []; - - /** - * 标签库分析数组 - * @var array - * @access protected - */ - protected $parse = []; - - /** - * 标签库是否有效 - * @var bool - * @access protected - */ - protected $valid = false; - - /** - * 当前模板对象 - * @var object - * @access protected - */ - protected $tpl; - - protected $comparison = [' nheq ' => ' !== ', ' heq ' => ' === ', ' neq ' => ' != ', ' eq ' => ' == ', ' egt ' => ' >= ', ' gt ' => ' > ', ' elt ' => ' <= ', ' lt ' => ' < ']; - - /** - * 架构函数 - * @access public - * @param \stdClass $template 模板引擎对象 - */ - public function __construct($template) - { - $this->tpl = $template; - } - - /** - * 按签标库替换页面中的标签 - * @access public - * @param string $content 模板内容 - * @param string $lib 标签库名 - * @return void - */ - public function parseTag(&$content, $lib = '') - { - $tags = []; - $lib = $lib ? strtolower($lib) . ':' : ''; - foreach ($this->tags as $name => $val) { - $close = !isset($val['close']) || $val['close'] ? 1 : 0; - $tags[$close][$lib . $name] = $name; - if (isset($val['alias'])) { - // 别名设置 - $array = (array) $val['alias']; - foreach (explode(',', $array[0]) as $v) { - $tags[$close][$lib . $v] = $name; - } - } - } - - // 闭合标签 - if (!empty($tags[1])) { - $nodes = []; - $regex = $this->getRegex(array_keys($tags[1]), 1); - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { - $right = []; - foreach ($matches as $match) { - if ('' == $match[1][0]) { - $name = strtolower($match[2][0]); - // 如果有没闭合的标签头则取出最后一个 - if (!empty($right[$name])) { - // $match[0][1]为标签结束符在模板中的位置 - $nodes[$match[0][1]] = [ - 'name' => $name, - 'begin' => array_pop($right[$name]), // 标签开始符 - 'end' => $match[0], // 标签结束符 - ]; - } - } else { - // 标签头压入栈 - $right[strtolower($match[1][0])][] = $match[0]; - } - } - unset($right, $matches); - // 按标签在模板中的位置从后向前排序 - krsort($nodes); - } - - $break = '<!--###break###--!>'; - if ($nodes) { - $beginArray = []; - // 标签替换 从后向前 - foreach ($nodes as $pos => $node) { - // 对应的标签名 - $name = $tags[1][$node['name']]; - $alias = $lib . $name != $node['name'] ? ($lib ? strstr($node['name'], $lib) : $node['name']) : ''; - // 解析标签属性 - $attrs = $this->parseAttr($node['begin'][0], $name, $alias); - $method = 'tag' . $name; - // 读取标签库中对应的标签内容 replace[0]用来替换标签头,replace[1]用来替换标签尾 - $replace = explode($break, $this->$method($attrs, $break)); - if (count($replace) > 1) { - while ($beginArray) { - $begin = end($beginArray); - // 判断当前标签尾的位置是否在栈中最后一个标签头的后面,是则为子标签 - if ($node['end'][1] > $begin['pos']) { - break; - } else { - // 不为子标签时,取出栈中最后一个标签头 - $begin = array_pop($beginArray); - // 替换标签头部 - $content = substr_replace($content, $begin['str'], $begin['pos'], $begin['len']); - } - } - // 替换标签尾部 - $content = substr_replace($content, $replace[1], $node['end'][1], strlen($node['end'][0])); - // 把标签头压入栈 - $beginArray[] = ['pos' => $node['begin'][1], 'len' => strlen($node['begin'][0]), 'str' => $replace[0]]; - } - } - while ($beginArray) { - $begin = array_pop($beginArray); - // 替换标签头部 - $content = substr_replace($content, $begin['str'], $begin['pos'], $begin['len']); - } - } - } - // 自闭合标签 - if (!empty($tags[0])) { - $regex = $this->getRegex(array_keys($tags[0]), 0); - $content = preg_replace_callback($regex, function ($matches) use (&$tags, &$lib) { - // 对应的标签名 - $name = $tags[0][strtolower($matches[1])]; - $alias = $lib . $name != $matches[1] ? ($lib ? strstr($matches[1], $lib) : $matches[1]) : ''; - // 解析标签属性 - $attrs = $this->parseAttr($matches[0], $name, $alias); - $method = 'tag' . $name; - return $this->$method($attrs, ''); - }, $content); - } - return; - } - - /** - * 按标签生成正则 - * @access private - * @param array|string $tags 标签名 - * @param boolean $close 是否为闭合标签 - * @return string - */ - private function getRegex($tags, $close) - { - $begin = $this->tpl->config('taglib_begin'); - $end = $this->tpl->config('taglib_end'); - $single = strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1 ? true : false; - $tagName = is_array($tags) ? implode('|', $tags) : $tags; - if ($single) { - if ($close) { - // 如果是闭合标签 - $regex = $begin . '(?:(' . $tagName . ')\b(?>[^' . $end . ']*)|\/(' . $tagName . '))' . $end; - } else { - $regex = $begin . '(' . $tagName . ')\b(?>[^' . $end . ']*)' . $end; - } - } else { - if ($close) { - // 如果是闭合标签 - $regex = $begin . '(?:(' . $tagName . ')\b(?>(?:(?!' . $end . ').)*)|\/(' . $tagName . '))' . $end; - } else { - $regex = $begin . '(' . $tagName . ')\b(?>(?:(?!' . $end . ').)*)' . $end; - } - } - return '/' . $regex . '/is'; - } - - /** - * 分析标签属性 正则方式 - * @access public - * @param string $str 标签属性字符串 - * @param string $name 标签名 - * @param string $alias 别名 - * @return array - */ - public function parseAttr($str, $name, $alias = '') - { - $regex = '/\s+(?>(?P<name>[\w-]+)\s*)=(?>\s*)([\"\'])(?P<value>(?:(?!\\2).)*)\\2/is'; - $result = []; - if (preg_match_all($regex, $str, $matches)) { - foreach ($matches['name'] as $key => $val) { - $result[$val] = $matches['value'][$key]; - } - if (!isset($this->tags[$name])) { - // 检测是否存在别名定义 - foreach ($this->tags as $key => $val) { - if (isset($val['alias'])) { - $array = (array) $val['alias']; - if (in_array($name, explode(',', $array[0]))) { - $tag = $val; - $type = !empty($array[1]) ? $array[1] : 'type'; - $result[$type] = $name; - break; - } - } - } - } else { - $tag = $this->tags[$name]; - // 设置了标签别名 - if (!empty($alias) && isset($tag['alias'])) { - $type = !empty($tag['alias'][1]) ? $tag['alias'][1] : 'type'; - $result[$type] = $alias; - } - } - if (!empty($tag['must'])) { - $must = explode(',', $tag['must']); - foreach ($must as $name) { - if (!isset($result[$name])) { - throw new Exception('tag attr must:' . $name); - } - } - } - } else { - // 允许直接使用表达式的标签 - if (!empty($this->tags[$name]['expression'])) { - static $_taglibs; - if (!isset($_taglibs[$name])) { - $_taglibs[$name][0] = strlen(ltrim($this->tpl->config('taglib_begin'), '\\') . $name); - $_taglibs[$name][1] = strlen(ltrim($this->tpl->config('taglib_end'), '\\')); - } - $result['expression'] = substr($str, $_taglibs[$name][0], -$_taglibs[$name][1]); - // 清除自闭合标签尾部/ - $result['expression'] = rtrim($result['expression'], '/'); - $result['expression'] = trim($result['expression']); - } elseif (empty($this->tags[$name]) || !empty($this->tags[$name]['attr'])) { - throw new Exception('tag error:' . $name); - } - } - return $result; - } - - /** - * 解析条件表达式 - * @access public - * @param string $condition 表达式标签内容 - * @return string - */ - public function parseCondition($condition) - { - if (strpos($condition, ':')) { - $condition = ' ' . substr(strstr($condition, ':'), 1); - } - $condition = str_ireplace(array_keys($this->comparison), array_values($this->comparison), $condition); - $this->tpl->parseVar($condition); - // $this->tpl->parseVarFunction($condition); // XXX: 此句能解析表达式中用|分隔的函数,但表达式中如果有|、||这样的逻辑运算就产生了歧异 - return $condition; - } - - /** - * 自动识别构建变量 - * @access public - * @param string $name 变量描述 - * @return string - */ - public function autoBuildVar(&$name) - { - $flag = substr($name, 0, 1); - if (':' == $flag) { - // 以:开头为函数调用,解析前去掉: - $name = substr($name, 1); - } elseif ('$' != $flag && preg_match('/[a-zA-Z_]/', $flag)) { - // XXX: 这句的写法可能还需要改进 - // 常量不需要解析 - if (defined($name)) { - return $name; - } - // 不以$开头并且也不是常量,自动补上$前缀 - $name = '$' . $name; - } - $this->tpl->parseVar($name); - $this->tpl->parseVarFunction($name); - return $name; - } - - /** - * 获取标签列表 - * @access public - * @return array - */ - // 获取标签定义 - public function getTags() - { - return $this->tags; - } -} diff --git a/thinkphp/library/think/template/driver/File.php b/thinkphp/library/think/template/driver/File.php deleted file mode 100755 index 1cd041a..0000000 --- a/thinkphp/library/think/template/driver/File.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\template\driver; - -use think\Exception; - -class File -{ - /** - * 写入编译缓存 - * @param string $cacheFile 缓存的文件名 - * @param string $content 缓存的内容 - * @return void|array - */ - public function write($cacheFile, $content) - { - // 检测模板目录 - $dir = dirname($cacheFile); - if (!is_dir($dir)) { - mkdir($dir, 0755, true); - } - // 生成模板缓存文件 - if (false === file_put_contents($cacheFile, $content)) { - throw new Exception('cache write error:' . $cacheFile, 11602); - } - } - - /** - * 读取编译编译 - * @param string $cacheFile 缓存的文件名 - * @param array $vars 变量数组 - * @return void - */ - public function read($cacheFile, $vars = []) - { - if (!empty($vars) && is_array($vars)) { - // 模板阵列变量分解成为独立变量 - extract($vars, EXTR_OVERWRITE); - } - //载入模版缓存文件 - include $cacheFile; - } - - /** - * 检查编译缓存是否有效 - * @param string $cacheFile 缓存的文件名 - * @param int $cacheTime 缓存时间 - * @return boolean - */ - public function check($cacheFile, $cacheTime) - { - // 缓存文件不存在, 直接返回false - if (!file_exists($cacheFile)) { - return false; - } - if (0 != $cacheTime && $_SERVER['REQUEST_TIME'] > filemtime($cacheFile) + $cacheTime) { - // 缓存是否在有效期 - return false; - } - return true; - } -} diff --git a/thinkphp/library/think/template/taglib/Cx.php b/thinkphp/library/think/template/taglib/Cx.php deleted file mode 100755 index b15c7bb..0000000 --- a/thinkphp/library/think/template/taglib/Cx.php +++ /dev/null @@ -1,673 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK IT ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\template\taglib; - -use think\template\TagLib; - -/** - * CX标签库解析类 - * @category Think - * @package Think - * @subpackage Driver.Taglib - * @author liu21st <liu21st@gmail.com> - */ -class Cx extends Taglib -{ - - // 标签定义 - protected $tags = [ - // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 - 'php' => ['attr' => ''], - 'volist' => ['attr' => 'name,id,offset,length,key,mod', 'alias' => 'iterate'], - 'foreach' => ['attr' => 'name,id,item,key,offset,length,mod', 'expression' => true], - 'if' => ['attr' => 'condition', 'expression' => true], - 'elseif' => ['attr' => 'condition', 'close' => 0, 'expression' => true], - 'else' => ['attr' => '', 'close' => 0], - 'switch' => ['attr' => 'name', 'expression' => true], - 'case' => ['attr' => 'value,break', 'expression' => true], - 'default' => ['attr' => '', 'close' => 0], - 'compare' => ['attr' => 'name,value,type', 'alias' => ['eq,equal,notequal,neq,gt,lt,egt,elt,heq,nheq', 'type']], - 'range' => ['attr' => 'name,value,type', 'alias' => ['in,notin,between,notbetween', 'type']], - 'empty' => ['attr' => 'name'], - 'notempty' => ['attr' => 'name'], - 'present' => ['attr' => 'name'], - 'notpresent' => ['attr' => 'name'], - 'defined' => ['attr' => 'name'], - 'notdefined' => ['attr' => 'name'], - 'load' => ['attr' => 'file,href,type,value,basepath', 'close' => 0, 'alias' => ['import,css,js', 'type']], - 'assign' => ['attr' => 'name,value', 'close' => 0], - 'define' => ['attr' => 'name,value', 'close' => 0], - 'for' => ['attr' => 'start,end,name,comparison,step'], - 'url' => ['attr' => 'link,vars,suffix,domain', 'close' => 0, 'expression' => true], - 'function' => ['attr' => 'name,vars,use,call'], - ]; - - /** - * php标签解析 - * 格式: - * {php}echo $name{/php} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagPhp($tag, $content) - { - $parseStr = '<?php ' . $content . ' ?>'; - return $parseStr; - } - - /** - * volist标签解析 循环输出数据集 - * 格式: - * {volist name="userList" id="user" empty=""} - * {user.username} - * {user.email} - * {/volist} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string|void - */ - public function tagVolist($tag, $content) - { - $name = $tag['name']; - $id = $tag['id']; - $empty = isset($tag['empty']) ? $tag['empty'] : ''; - $key = !empty($tag['key']) ? $tag['key'] : 'i'; - $mod = isset($tag['mod']) ? $tag['mod'] : '2'; - $offset = !empty($tag['offset']) && is_numeric($tag['offset']) ? intval($tag['offset']) : 0; - $length = !empty($tag['length']) && is_numeric($tag['length']) ? intval($tag['length']) : 'null'; - // 允许使用函数设定数据集 <volist name=":fun('arg')" id="vo">{$vo.name}</volist> - $parseStr = '<?php '; - $flag = substr($name, 0, 1); - if (':' == $flag) { - $name = $this->autoBuildVar($name); - $parseStr .= '$_result=' . $name . ';'; - $name = '$_result'; - } else { - $name = $this->autoBuildVar($name); - } - - $parseStr .= 'if(is_array(' . $name . ') || ' . $name . ' instanceof \think\Collection): $' . $key . ' = 0;'; - // 设置了输出数组长度 - if (0 != $offset || 'null' != $length) { - $parseStr .= '$__LIST__ = is_array(' . $name . ') ? array_slice(' . $name . ',' . $offset . ',' . $length . ', true) : ' . $name . '->slice(' . $offset . ',' . $length . ', true); '; - } else { - $parseStr .= ' $__LIST__ = ' . $name . ';'; - } - $parseStr .= 'if( count($__LIST__)==0 ) : echo "' . $empty . '" ;'; - $parseStr .= 'else: '; - $parseStr .= 'foreach($__LIST__ as $key=>$' . $id . '): '; - $parseStr .= '$mod = ($' . $key . ' % ' . $mod . ' );'; - $parseStr .= '++$' . $key . ';?>'; - $parseStr .= $content; - $parseStr .= '<?php endforeach; endif; else: echo "' . $empty . '" ;endif; ?>'; - - if (!empty($parseStr)) { - return $parseStr; - } - return; - } - - /** - * foreach标签解析 循环输出数据集 - * 格式: - * {foreach name="userList" id="user" key="key" index="i" mod="2" offset="3" length="5" empty=""} - * {user.username} - * {/foreach} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string|void - */ - public function tagForeach($tag, $content) - { - // 直接使用表达式 - if (!empty($tag['expression'])) { - $expression = ltrim(rtrim($tag['expression'], ')'), '('); - $expression = $this->autoBuildVar($expression); - $parseStr = '<?php foreach(' . $expression . '): ?>'; - $parseStr .= $content; - $parseStr .= '<?php endforeach; ?>'; - return $parseStr; - } - $name = $tag['name']; - $key = !empty($tag['key']) ? $tag['key'] : 'key'; - $item = !empty($tag['id']) ? $tag['id'] : $tag['item']; - $empty = isset($tag['empty']) ? $tag['empty'] : ''; - $offset = !empty($tag['offset']) && is_numeric($tag['offset']) ? intval($tag['offset']) : 0; - $length = !empty($tag['length']) && is_numeric($tag['length']) ? intval($tag['length']) : 'null'; - - $parseStr = '<?php '; - // 支持用函数传数组 - if (':' == substr($name, 0, 1)) { - $var = '$_' . uniqid(); - $name = $this->autoBuildVar($name); - $parseStr .= $var . '=' . $name . '; '; - $name = $var; - } else { - $name = $this->autoBuildVar($name); - } - $parseStr .= 'if(is_array(' . $name . ') || ' . $name . ' instanceof \think\Collection): '; - // 设置了输出数组长度 - if (0 != $offset || 'null' != $length) { - if (!isset($var)) { - $var = '$_' . uniqid(); - } - $parseStr .= $var . ' = is_array(' . $name . ') ? array_slice(' . $name . ',' . $offset . ',' . $length . ', true) : ' . $name . '->slice(' . $offset . ',' . $length . ', true); '; - } else { - $var = &$name; - } - - $parseStr .= 'if( count(' . $var . ')==0 ) : echo "' . $empty . '" ;'; - $parseStr .= 'else: '; - - // 设置了索引项 - if (isset($tag['index'])) { - $index = $tag['index']; - $parseStr .= '$' . $index . '=0; '; - } - $parseStr .= 'foreach(' . $var . ' as $' . $key . '=>$' . $item . '): '; - // 设置了索引项 - if (isset($tag['index'])) { - $index = $tag['index']; - if (isset($tag['mod'])) { - $mod = (int) $tag['mod']; - $parseStr .= '$mod = ($' . $index . ' % ' . $mod . '); '; - } - $parseStr .= '++$' . $index . '; '; - } - $parseStr .= '?>'; - // 循环体中的内容 - $parseStr .= $content; - $parseStr .= '<?php endforeach; endif; else: echo "' . $empty . '" ;endif; ?>'; - - if (!empty($parseStr)) { - return $parseStr; - } - return; - } - - /** - * if标签解析 - * 格式: - * {if condition=" $a eq 1"} - * {elseif condition="$a eq 2" /} - * {else /} - * {/if} - * 表达式支持 eq neq gt egt lt elt == > >= < <= or and || && - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagIf($tag, $content) - { - $condition = !empty($tag['expression']) ? $tag['expression'] : $tag['condition']; - $condition = $this->parseCondition($condition); - $parseStr = '<?php if(' . $condition . '): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * elseif标签解析 - * 格式:见if标签 - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagElseif($tag, $content) - { - $condition = !empty($tag['expression']) ? $tag['expression'] : $tag['condition']; - $condition = $this->parseCondition($condition); - $parseStr = '<?php elseif(' . $condition . '): ?>'; - return $parseStr; - } - - /** - * else标签解析 - * 格式:见if标签 - * @access public - * @param array $tag 标签属性 - * @return string - */ - public function tagElse($tag) - { - $parseStr = '<?php else: ?>'; - return $parseStr; - } - - /** - * switch标签解析 - * 格式: - * {switch name="a.name"} - * {case value="1" break="false"}1{/case} - * {case value="2" }2{/case} - * {default /}other - * {/switch} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagSwitch($tag, $content) - { - $name = !empty($tag['expression']) ? $tag['expression'] : $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '<?php switch(' . $name . '): ?>' . $content . '<?php endswitch; ?>'; - return $parseStr; - } - - /** - * case标签解析 需要配合switch才有效 - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagCase($tag, $content) - { - $value = !empty($tag['expression']) ? $tag['expression'] : $tag['value']; - $flag = substr($value, 0, 1); - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - $value = 'case ' . $value . ':'; - } elseif (strpos($value, '|')) { - $values = explode('|', $value); - $value = ''; - foreach ($values as $val) { - $value .= 'case "' . addslashes($val) . '":'; - } - } else { - $value = 'case "' . $value . '":'; - } - $parseStr = '<?php ' . $value . ' ?>' . $content; - $isBreak = isset($tag['break']) ? $tag['break'] : ''; - if ('' == $isBreak || $isBreak) { - $parseStr .= '<?php break; ?>'; - } - return $parseStr; - } - - /** - * default标签解析 需要配合switch才有效 - * 使用: {default /}ddfdf - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagDefault($tag) - { - $parseStr = '<?php default: ?>'; - return $parseStr; - } - - /** - * compare标签解析 - * 用于值的比较 支持 eq neq gt lt egt elt heq nheq 默认是eq - * 格式: {compare name="" type="eq" value="" }content{/compare} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagCompare($tag, $content) - { - $name = $tag['name']; - $value = $tag['value']; - $type = isset($tag['type']) ? $tag['type'] : 'eq'; // 比较类型 - $name = $this->autoBuildVar($name); - $flag = substr($value, 0, 1); - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - } else { - $value = '\'' . $value . '\''; - } - switch ($type) { - case 'equal': - $type = 'eq'; - break; - case 'notequal': - $type = 'neq'; - break; - } - $type = $this->parseCondition(' ' . $type . ' '); - $parseStr = '<?php if(' . $name . ' ' . $type . ' ' . $value . '): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * range标签解析 - * 如果某个变量存在于某个范围 则输出内容 type= in 表示在范围内 否则表示在范围外 - * 格式: {range name="var|function" value="val" type='in|notin' }content{/range} - * example: {range name="a" value="1,2,3" type='in' }content{/range} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagRange($tag, $content) - { - $name = $tag['name']; - $value = $tag['value']; - $type = isset($tag['type']) ? $tag['type'] : 'in'; // 比较类型 - - $name = $this->autoBuildVar($name); - $flag = substr($value, 0, 1); - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - $str = 'is_array(' . $value . ')?' . $value . ':explode(\',\',' . $value . ')'; - } else { - $value = '"' . $value . '"'; - $str = 'explode(\',\',' . $value . ')'; - } - if ('between' == $type) { - $parseStr = '<?php $_RANGE_VAR_=' . $str . ';if(' . $name . '>= $_RANGE_VAR_[0] && ' . $name . '<= $_RANGE_VAR_[1]):?>' . $content . '<?php endif; ?>'; - } elseif ('notbetween' == $type) { - $parseStr = '<?php $_RANGE_VAR_=' . $str . ';if(' . $name . '<$_RANGE_VAR_[0] || ' . $name . '>$_RANGE_VAR_[1]):?>' . $content . '<?php endif; ?>'; - } else { - $fun = ('in' == $type) ? 'in_array' : '!in_array'; - $parseStr = '<?php if(' . $fun . '((' . $name . '), ' . $str . ')): ?>' . $content . '<?php endif; ?>'; - } - return $parseStr; - } - - /** - * present标签解析 - * 如果某个变量已经设置 则输出内容 - * 格式: {present name="" }content{/present} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagPresent($tag, $content) - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '<?php if(isset(' . $name . ')): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * notpresent标签解析 - * 如果某个变量没有设置,则输出内容 - * 格式: {notpresent name="" }content{/notpresent} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagNotpresent($tag, $content) - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '<?php if(!isset(' . $name . ')): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * empty标签解析 - * 如果某个变量为empty 则输出内容 - * 格式: {empty name="" }content{/empty} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagEmpty($tag, $content) - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '<?php if(empty(' . $name . ') || (' . $name . ' instanceof \think\Collection && ' . $name . '->isEmpty())): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * notempty标签解析 - * 如果某个变量不为empty 则输出内容 - * 格式: {notempty name="" }content{/notempty} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagNotempty($tag, $content) - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '<?php if(!(empty(' . $name . ') || (' . $name . ' instanceof \think\Collection && ' . $name . '->isEmpty()))): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * 判断是否已经定义了该常量 - * {defined name='TXT'}已定义{/defined} - * @param array $tag - * @param string $content - * @return string - */ - public function tagDefined($tag, $content) - { - $name = $tag['name']; - $parseStr = '<?php if(defined("' . $name . '")): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * 判断是否没有定义了该常量 - * {notdefined name='TXT'}已定义{/notdefined} - * @param array $tag - * @param string $content - * @return string - */ - public function tagNotdefined($tag, $content) - { - $name = $tag['name']; - $parseStr = '<?php if(!defined("' . $name . '")): ?>' . $content . '<?php endif; ?>'; - return $parseStr; - } - - /** - * load 标签解析 {load file="/static/js/base.js" /} - * 格式:{load file="/static/css/base.css" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagLoad($tag, $content) - { - $file = isset($tag['file']) ? $tag['file'] : $tag['href']; - $type = isset($tag['type']) ? strtolower($tag['type']) : ''; - $parseStr = ''; - $endStr = ''; - // 判断是否存在加载条件 允许使用函数判断(默认为isset) - if (isset($tag['value'])) { - $name = $tag['value']; - $name = $this->autoBuildVar($name); - $name = 'isset(' . $name . ')'; - $parseStr .= '<?php if(' . $name . '): ?>'; - $endStr = '<?php endif; ?>'; - } - - // 文件方式导入 - $array = explode(',', $file); - foreach ($array as $val) { - $type = strtolower(substr(strrchr($val, '.'), 1)); - switch ($type) { - case 'js': - $parseStr .= '<script type="text/javascript" src="' . $val . '"></script>'; - break; - case 'css': - $parseStr .= '<link rel="stylesheet" type="text/css" href="' . $val . '" />'; - break; - case 'php': - $parseStr .= '<?php include "' . $val . '"; ?>'; - break; - } - } - return $parseStr . $endStr; - } - - /** - * assign标签解析 - * 在模板中给某个变量赋值 支持变量赋值 - * 格式: {assign name="" value="" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagAssign($tag, $content) - { - $name = $this->autoBuildVar($tag['name']); - $flag = substr($tag['value'], 0, 1); - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($tag['value']); - } else { - $value = '\'' . $tag['value'] . '\''; - } - $parseStr = '<?php ' . $name . ' = ' . $value . '; ?>'; - return $parseStr; - } - - /** - * define标签解析 - * 在模板中定义常量 支持变量赋值 - * 格式: {define name="" value="" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagDefine($tag, $content) - { - $name = '\'' . $tag['name'] . '\''; - $flag = substr($tag['value'], 0, 1); - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($tag['value']); - } else { - $value = '\'' . $tag['value'] . '\''; - } - $parseStr = '<?php define(' . $name . ', ' . $value . '); ?>'; - return $parseStr; - } - - /** - * for标签解析 - * 格式: - * {for start="" end="" comparison="" step="" name=""} - * content - * {/for} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagFor($tag, $content) - { - //设置默认值 - $start = 0; - $end = 0; - $step = 1; - $comparison = 'lt'; - $name = 'i'; - $rand = rand(); //添加随机数,防止嵌套变量冲突 - //获取属性 - foreach ($tag as $key => $value) { - $value = trim($value); - $flag = substr($value, 0, 1); - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - } - - switch ($key) { - case 'start': - $start = $value; - break; - case 'end': - $end = $value; - break; - case 'step': - $step = $value; - break; - case 'comparison': - $comparison = $value; - break; - case 'name': - $name = $value; - break; - } - } - - $parseStr = '<?php $__FOR_START_' . $rand . '__=' . $start . ';$__FOR_END_' . $rand . '__=' . $end . ';'; - $parseStr .= 'for($' . $name . '=$__FOR_START_' . $rand . '__;' . $this->parseCondition('$' . $name . ' ' . $comparison . ' $__FOR_END_' . $rand . '__') . ';$' . $name . '+=' . $step . '){ ?>'; - $parseStr .= $content; - $parseStr .= '<?php } ?>'; - return $parseStr; - } - - /** - * U函数的tag标签 - * 格式:{url link="模块/控制器/方法" vars="参数" suffix="true或者false 是否带有后缀" domain="true或者false 是否携带域名" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagUrl($tag, $content) - { - $url = isset($tag['link']) ? $tag['link'] : ''; - $vars = isset($tag['vars']) ? $tag['vars'] : ''; - $suffix = isset($tag['suffix']) ? $tag['suffix'] : 'true'; - $domain = isset($tag['domain']) ? $tag['domain'] : 'false'; - return '<?php echo url("' . $url . '","' . $vars . '",' . $suffix . ',' . $domain . ');?>'; - } - - /** - * function标签解析 匿名函数,可实现递归 - * 使用: - * {function name="func" vars="$data" call="$list" use="&$a,&$b"} - * {if is_array($data)} - * {foreach $data as $val} - * {~func($val) /} - * {/foreach} - * {else /} - * {$data} - * {/if} - * {/function} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagFunction($tag, $content) - { - $name = !empty($tag['name']) ? $tag['name'] : 'func'; - $vars = !empty($tag['vars']) ? $tag['vars'] : ''; - $call = !empty($tag['call']) ? $tag['call'] : ''; - $use = ['&$' . $name]; - if (!empty($tag['use'])) { - foreach (explode(',', $tag['use']) as $val) { - $use[] = '&' . ltrim(trim($val), '&'); - } - } - $parseStr = '<?php $' . $name . '=function(' . $vars . ') use(' . implode(',', $use) . ') {'; - $parseStr .= ' ?>' . $content . '<?php }; '; - $parseStr .= $call ? '$' . $name . '(' . $call . '); ?>' : '?>'; - return $parseStr; - } -} diff --git a/thinkphp/library/think/view/driver/Php.php b/thinkphp/library/think/view/driver/Php.php deleted file mode 100755 index 31fe780..0000000 --- a/thinkphp/library/think/view/driver/Php.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\view\driver; - -use think\App; -use think\exception\TemplateNotFoundException; -use think\Loader; -use think\Log; -use think\Request; - -class Php -{ - // 模板引擎参数 - protected $config = [ - // 模板起始路径 - 'view_path' => '', - // 模板文件后缀 - 'view_suffix' => 'php', - // 模板文件名分隔符 - 'view_depr' => DS, - ]; - - public function __construct($config = []) - { - $this->config = array_merge($this->config, $config); - } - - /** - * 检测是否存在模板文件 - * @access public - * @param string $template 模板文件或者模板规则 - * @return bool - */ - public function exists($template) - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - return is_file($template); - } - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $data 模板变量 - * @return void - */ - public function fetch($template, $data = []) - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - // 模板不存在 抛出异常 - if (!is_file($template)) { - throw new TemplateNotFoundException('template not exists:' . $template, $template); - } - // 记录视图信息 - App::$debug && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export(array_keys($data), true) . ' ]', 'info'); - if (isset($data['template'])) { - $__template__ = $template; - extract($data, EXTR_OVERWRITE); - include $__template__; - } else { - extract($data, EXTR_OVERWRITE); - include $template; - } - } - - /** - * 渲染模板内容 - * @access public - * @param string $content 模板内容 - * @param array $data 模板变量 - * @return void - */ - public function display($content, $data = []) - { - if (isset($data['content'])) { - $__content__ = $content; - extract($data, EXTR_OVERWRITE); - eval('?>' . $__content__); - } else { - extract($data, EXTR_OVERWRITE); - eval('?>' . $content); - } - } - - /** - * 自动定位模板文件 - * @access private - * @param string $template 模板文件规则 - * @return string - */ - private function parseTemplate($template) - { - if (empty($this->config['view_path'])) { - $this->config['view_path'] = App::$modulePath . 'view' . DS; - } - - if (strpos($template, '@')) { - list($module, $template) = explode('@', $template); - $path = APP_PATH . $module . DS . 'view' . DS; - } else { - $path = $this->config['view_path']; - } - - // 分析模板文件规则 - $request = Request::instance(); - $controller = Loader::parseName($request->controller()); - if ($controller && 0 !== strpos($template, '/')) { - $depr = $this->config['view_depr']; - $template = str_replace(['/', ':'], $depr, $template); - if ('' == $template) { - // 如果模板文件名为空 按照默认规则定位 - $template = str_replace('.', DS, $controller) . $depr . $request->action(); - } elseif (false === strpos($template, $depr)) { - $template = str_replace('.', DS, $controller) . $depr . $template; - } - } - return $path . ltrim($template, '/') . '.' . ltrim($this->config['view_suffix'], '.'); - } - - /** - * 配置模板引擎 - * @access private - * @param string|array $name 参数名 - * @param mixed $value 参数值 - * @return void - */ - public function config($name, $value = null) - { - if (is_array($name)) { - $this->config = array_merge($this->config, $name); - } elseif (is_null($value)) { - return isset($this->config[$name]) ? $this->config[$name] : null; - } else { - $this->config[$name] = $value; - } - } - -} diff --git a/thinkphp/library/think/view/driver/Think.php b/thinkphp/library/think/view/driver/Think.php deleted file mode 100755 index db1d981..0000000 --- a/thinkphp/library/think/view/driver/Think.php +++ /dev/null @@ -1,161 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think\view\driver; - -use think\App; -use think\exception\TemplateNotFoundException; -use think\Loader; -use think\Log; -use think\Request; -use think\Template; - -class Think -{ - // 模板引擎实例 - private $template; - // 模板引擎参数 - protected $config = [ - // 视图基础目录(集中式) - 'view_base' => '', - // 模板起始路径 - 'view_path' => '', - // 模板文件后缀 - 'view_suffix' => 'html', - // 模板文件名分隔符 - 'view_depr' => DS, - // 是否开启模板编译缓存,设为false则每次都会重新编译 - 'tpl_cache' => true, - ]; - - public function __construct($config = []) - { - $this->config = array_merge($this->config, $config); - if (empty($this->config['view_path'])) { - $this->config['view_path'] = App::$modulePath . 'view' . DS; - } - - $this->template = new Template($this->config); - } - - /** - * 检测是否存在模板文件 - * @access public - * @param string $template 模板文件或者模板规则 - * @return bool - */ - public function exists($template) - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - return is_file($template); - } - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $data 模板变量 - * @param array $config 模板参数 - * @return void - */ - public function fetch($template, $data = [], $config = []) - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - // 模板不存在 抛出异常 - if (!is_file($template)) { - throw new TemplateNotFoundException('template not exists:' . $template, $template); - } - // 记录视图信息 - App::$debug && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export(array_keys($data), true) . ' ]', 'info'); - $this->template->fetch($template, $data, $config); - } - - /** - * 渲染模板内容 - * @access public - * @param string $template 模板内容 - * @param array $data 模板变量 - * @param array $config 模板参数 - * @return void - */ - public function display($template, $data = [], $config = []) - { - $this->template->display($template, $data, $config); - } - - /** - * 自动定位模板文件 - * @access private - * @param string $template 模板文件规则 - * @return string - */ - private function parseTemplate($template) - { - // 分析模板文件规则 - $request = Request::instance(); - // 获取视图根目录 - if (strpos($template, '@')) { - // 跨模块调用 - list($module, $template) = explode('@', $template); - } - if ($this->config['view_base']) { - // 基础视图目录 - $module = isset($module) ? $module : $request->module(); - $path = $this->config['view_base'] . ($module ? $module . DS : ''); - } else { - $path = isset($module) ? APP_PATH . $module . DS . 'view' . DS : $this->config['view_path']; - } - - $controller = Loader::parseName($request->controller()); - if ($controller && 0 !== strpos($template, '/')) { - $depr = $this->config['view_depr']; - $template = str_replace(['/', ':'], $depr, $template); - if ('' == $template) { - // 如果模板文件名为空 按照默认规则定位 - $template = str_replace('.', DS, $controller) . $depr . $request->action(); - } elseif (false === strpos($template, $depr)) { - $template = str_replace('.', DS, $controller) . $depr . $template; - } - } - return $path . ltrim($template, '/') . '.' . ltrim($this->config['view_suffix'], '.'); - } - - /** - * 配置或者获取模板引擎参数 - * @access private - * @param string|array $name 参数名 - * @param mixed $value 参数值 - * @return mixed - */ - public function config($name, $value = null) - { - if (is_array($name)) { - $this->template->config($name); - $this->config = array_merge($this->config, $name); - } elseif (is_null($value)) { - return $this->template->config($name); - } else { - $this->template->$name = $value; - $this->config[$name] = $value; - } - } - - public function __call($method, $params) - { - return call_user_func_array([$this->template, $method], $params); - } -} diff --git a/thinkphp/library/traits/controller/Jump.php b/thinkphp/library/traits/controller/Jump.php deleted file mode 100755 index 0fad996..0000000 --- a/thinkphp/library/traits/controller/Jump.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php - -/** - * 用法: - * load_trait('controller/Jump'); - * class index - * { - * use \traits\controller\Jump; - * public function index(){ - * $this->error(); - * $this->redirect(); - * } - * } - */ -namespace traits\controller; - -use think\Config; -use think\exception\HttpResponseException; -use think\Request; -use think\Response; -use think\response\Redirect; -use think\Url; -use think\View as ViewTemplate; - -trait Jump -{ - /** - * 操作成功跳转的快捷方法 - * @access protected - * @param mixed $msg 提示信息 - * @param string $url 跳转的URL地址 - * @param mixed $data 返回的数据 - * @param integer $wait 跳转等待时间 - * @param array $header 发送的Header信息 - * @return void - */ - protected function success($msg = '', $url = null, $data = '', $wait = 3, array $header = []) - { - $code = 1; - if (is_numeric($msg)) { - $code = $msg; - $msg = ''; - } - if (is_null($url) && isset($_SERVER["HTTP_REFERER"])) { - $url = $_SERVER["HTTP_REFERER"]; - } elseif ('' !== $url) { - $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : Url::build($url); - } - $result = [ - 'code' => $code, - 'msg' => $msg, - 'data' => $data, - 'url' => $url, - 'wait' => $wait, - ]; - - $type = $this->getResponseType(); - if ('html' == strtolower($type)) { - $result = ViewTemplate::instance(Config::get('template'), Config::get('view_replace_str')) - ->fetch(Config::get('dispatch_success_tmpl'), $result); - } - $response = Response::create($result, $type)->header($header); - throw new HttpResponseException($response); - } - - /** - * 操作错误跳转的快捷方法 - * @access protected - * @param mixed $msg 提示信息 - * @param string $url 跳转的URL地址 - * @param mixed $data 返回的数据 - * @param integer $wait 跳转等待时间 - * @param array $header 发送的Header信息 - * @return void - */ - protected function error($msg = '', $url = null, $data = '', $wait = 3, array $header = []) - { - $code = 0; - if (is_numeric($msg)) { - $code = $msg; - $msg = ''; - } - if (is_null($url)) { - $url = 'javascript:history.back(-1);'; - } elseif ('' !== $url) { - $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : Url::build($url); - } - $result = [ - 'code' => $code, - 'msg' => $msg, - 'data' => $data, - 'url' => $url, - 'wait' => $wait, - ]; - - $type = $this->getResponseType(); - if ('html' == strtolower($type)) { - $result = ViewTemplate::instance(Config::get('template'), Config::get('view_replace_str')) - ->fetch(Config::get('dispatch_error_tmpl'), $result); - } - $response = Response::create($result, $type)->header($header); - throw new HttpResponseException($response); - } - - /** - * 返回封装后的API数据到客户端 - * @access protected - * @param mixed $data 要返回的数据 - * @param integer $code 返回的code - * @param mixed $msg 提示信息 - * @param string $type 返回数据格式 - * @param array $header 发送的Header信息 - * @return void - */ - protected function result($data, $code = 0, $msg = '', $type = '', array $header = []) - { - $result = [ - 'code' => $code, - 'msg' => $msg, - 'time' => $_SERVER['REQUEST_TIME'], - 'data' => $data, - ]; - $type = $type ?: $this->getResponseType(); - $response = Response::create($result, $type)->header($header); - throw new HttpResponseException($response); - } - - /** - * URL重定向 - * @access protected - * @param string $url 跳转的URL表达式 - * @param array|integer $params 其它URL参数 - * @param integer $code http code - * @return void - */ - protected function redirect($url, $params = [], $code = 302) - { - $response = new Redirect($url); - if (is_integer($params)) { - $code = $params; - $params = []; - } - $response->code($code)->params($params); - throw new HttpResponseException($response); - } - - /** - * 获取当前的response 输出类型 - * @access protected - * @return string - */ - protected function getResponseType() - { - $isAjax = Request::instance()->isAjax(); - return $isAjax ? Config::get('default_ajax_return') : Config::get('default_return_type'); - } -} diff --git a/thinkphp/library/traits/model/SoftDelete.php b/thinkphp/library/traits/model/SoftDelete.php deleted file mode 100755 index 9d855c7..0000000 --- a/thinkphp/library/traits/model/SoftDelete.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php - -namespace traits\model; - -trait SoftDelete -{ - - /** - * 判断当前实例是否被软删除 - * @access public - * @return boolean - */ - public function trashed() - { - $field = $this->getDeleteTimeField(); - if (!empty($this->data[$field])) { - return true; - } - return false; - } - - /** - * 查询软删除数据 - * @access public - * @return \think\db\Query - */ - public static function withTrashed() - { - $model = new static(); - $field = $model->getDeleteTimeField(true); - return $model->db(false)->removeWhereField($field); - } - - /** - * 只查询软删除数据 - * @access public - * @return \think\db\Query - */ - public static function onlyTrashed() - { - $model = new static(); - $field = $model->getDeleteTimeField(true); - return $model->db(false)->where($field, 'exp', 'is not null'); - } - - /** - * 删除当前的记录 - * @access public - * @param bool $force 是否强制删除 - * @return integer - */ - public function delete($force = false) - { - if (false === $this->trigger('before_delete', $this)) { - return false; - } - $name = $this->getDeleteTimeField(); - if (!$force) { - // 软删除 - $this->change[] = $name; - $this->data[$name] = $this->autoWriteTimestamp($name); - $result = $this->isUpdate()->save(); - } else { - $result = $this->db()->delete($this->data); - } - - $this->trigger('after_delete', $this); - return $result; - } - - /** - * 删除记录 - * @access public - * @param mixed $data 主键列表 支持闭包查询条件 - * @param bool $force 是否强制删除 - * @return integer 成功删除的记录数 - */ - public static function destroy($data, $force = false) - { - $model = new static(); - $query = $model->db(); - if (is_array($data) && key($data) !== 0) { - $query->where($data); - $data = null; - } elseif ($data instanceof \Closure) { - call_user_func_array($data, [ & $query]); - $data = null; - } elseif (is_null($data)) { - return 0; - } - - $resultSet = $query->select($data); - $count = 0; - if ($resultSet) { - foreach ($resultSet as $data) { - $result = $data->delete($force); - $count += $result; - } - } - return $count; - } - - /** - * 恢复被软删除的记录 - * @access public - * @param array $where 更新条件 - * @return integer - */ - public function restore($where = []) - { - $name = $this->getDeleteTimeField(); - // 恢复删除 - return $this->isUpdate()->save([$name => null], $where); - - } - - /** - * 查询默认不包含软删除数据 - * @access protected - * @param \think\db\Query $query 查询对象 - * @return void - */ - protected function base($query) - { - $field = $this->getDeleteTimeField(true); - $query->where($field, 'null'); - } - - /** - * 获取软删除字段 - * @access public - * @param bool $read 是否查询操作 写操作的时候会自动去掉表别名 - * @return string - */ - protected function getDeleteTimeField($read = false) - { - $field = isset($this->deleteTime) ? $this->deleteTime : 'delete_time'; - if (!strpos($field, '.')) { - $field = $this->db(false)->getTable() . '.' . $field; - } - if (!$read && strpos($field, '.')) { - $array = explode('.', $field); - $field = array_pop($array); - } - return $field; - } -} diff --git a/thinkphp/library/traits/think/Instance.php b/thinkphp/library/traits/think/Instance.php deleted file mode 100755 index 206a941..0000000 --- a/thinkphp/library/traits/think/Instance.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace traits\think; - -use \think\Exception; - -trait Instance -{ - protected static $instance = null; - - /** - * @param array $options - * @return static - */ - public static function instance($options = []) - { - if (is_null(self::$instance)) { - self::$instance = new self($options); - } - return self::$instance; - } - - // 静态调用 - public static function __callStatic($method, $params) - { - if (is_null(self::$instance)) { - self::$instance = new self(); - } - $call = substr($method, 1); - if (0 === strpos($method, '_') && is_callable([self::$instance, $call])) { - return call_user_func_array([self::$instance, $call], $params); - } else { - throw new Exception("method not exists:" . $method); - } - } -} diff --git a/thinkphp/logo.png b/thinkphp/logo.png deleted file mode 100755 index 25fd0593688de5c9f4cd321da1a72ab9566fe331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6995 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 diff --git a/thinkphp/start.php b/thinkphp/start.php deleted file mode 100755 index 2d51791..0000000 --- a/thinkphp/start.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php -// +---------------------------------------------------------------------- -// | ThinkPHP [ WE CAN DO IT JUST THINK ] -// +---------------------------------------------------------------------- -// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. -// +---------------------------------------------------------------------- -// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) -// +---------------------------------------------------------------------- -// | Author: liu21st <liu21st@gmail.com> -// +---------------------------------------------------------------------- - -namespace think; - -// ThinkPHP 引导文件 -// 加载基础文件 -require __DIR__ . '/base.php'; -// 执行应用 -App::run()->send(); diff --git a/thinkphp/tpl/default_index.tpl b/thinkphp/tpl/default_index.tpl deleted file mode 100755 index 8538b4d..0000000 --- a/thinkphp/tpl/default_index.tpl +++ /dev/null @@ -1,10 +0,0 @@ -<?php -namespace {$app}\{$module}{layer}; - -class Index{$suffix} -{ - public function index() - { - return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_bd568ce7058a1091"></thinkad>'; - } -} diff --git a/thinkphp/tpl/dispatch_jump.tpl b/thinkphp/tpl/dispatch_jump.tpl deleted file mode 100755 index 18ee01b..0000000 --- a/thinkphp/tpl/dispatch_jump.tpl +++ /dev/null @@ -1,48 +0,0 @@ -{__NOLAYOUT__}<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>跳转提示</title> - <style type="text/css"> - *{ padding: 0; margin: 0; } - body{ background: #fff; font-family: "Microsoft Yahei","Helvetica Neue",Helvetica,Arial,sans-serif; color: #333; font-size: 16px; } - .system-message{ padding: 24px 48px; } - .system-message h1{ font-size: 100px; font-weight: normal; line-height: 120px; margin-bottom: 12px; } - .system-message .jump{ padding-top: 10px; } - .system-message .jump a{ color: #333; } - .system-message .success,.system-message .error{ line-height: 1.8em; font-size: 36px; } - .system-message .detail{ font-size: 12px; line-height: 20px; margin-top: 12px; display: none; } - </style> -</head> -<body> - <div class="system-message"> - <?php switch ($code) {?> - <?php case 1:?> - <h1>:)</h1> - <p class="success"><?php echo(strip_tags($msg));?></p> - <?php break;?> - <?php case 0:?> - <h1>:(</h1> - <p class="error"><?php echo(strip_tags($msg));?></p> - <?php break;?> - <?php } ?> - <p class="detail"></p> - <p class="jump"> - 页面自动 <a id="href" href="<?php echo($url);?>">跳转</a> 等待时间: <b id="wait"><?php echo($wait);?></b> - </p> - </div> - <script type="text/javascript"> - (function(){ - var wait = document.getElementById('wait'), - href = document.getElementById('href').href; - var interval = setInterval(function(){ - var time = --wait.innerHTML; - if(time <= 0) { - location.href = href; - clearInterval(interval); - }; - }, 1000); - })(); - </script> -</body> -</html> diff --git a/thinkphp/tpl/page_trace.tpl b/thinkphp/tpl/page_trace.tpl deleted file mode 100755 index 7c5df6f..0000000 --- a/thinkphp/tpl/page_trace.tpl +++ /dev/null @@ -1,71 +0,0 @@ -<div id="think_page_trace" style="position: fixed;bottom:0;right:0;font-size:14px;width:100%;z-index: 999999;color: #000;text-align:left;font-family:'微软雅黑';"> - <div id="think_page_trace_tab" style="display: none;background:white;margin:0;height: 250px;"> - <div id="think_page_trace_tab_tit" style="height:30px;padding: 6px 12px 0;border-bottom:1px solid #ececec;border-top:1px solid #ececec;font-size:16px"> - <?php foreach ($trace as $key => $value) {?> - <span style="color:#000;padding-right:12px;height:30px;line-height:30px;display:inline-block;margin-right:3px;cursor:pointer;font-weight:700"><?php echo $key ?></span> - <?php }?> - </div> - <div id="think_page_trace_tab_cont" style="overflow:auto;height:212px;padding:0;line-height: 24px"> - <?php foreach ($trace as $info) {?> - <div style="display:none;"> - <ol style="padding: 0; margin:0"> - <?php - if (is_array($info)) { - foreach ($info as $k => $val) { - echo '<li style="border-bottom:1px solid #EEE;font-size:14px;padding:0 12px">' . (is_numeric($k) ? '' : $k.' : ') . htmlentities(print_r($val,true), ENT_COMPAT, 'utf-8') . '</li>'; - } - } - ?> - </ol> - </div> - <?php }?> - </div> - </div> - <div id="think_page_trace_close" style="display:none;text-align:right;height:15px;position:absolute;top:10px;right:12px;cursor:pointer;"><img style="vertical-align:top;" src="data:image/gif;base64,R0lGODlhDwAPAJEAAAAAAAMDA////wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MUQxMjc1MUJCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MUQxMjc1MUNCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxRDEyNzUxOUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxRDEyNzUxQUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAAPAA8AAAIdjI6JZqotoJPR1fnsgRR3C2jZl3Ai9aWZZooV+RQAOw==" /></div> -</div> -<div id="think_page_trace_open" style="height:30px;float:right;text-align:right;overflow:hidden;position:fixed;bottom:0;right:0;color:#000;line-height:30px;cursor:pointer;"> - <div style="background:#232323;color:#FFF;padding:0 6px;float:right;line-height:30px;font-size:14px"><?php echo \think\Debug::getUseTime().'s ';?></div> - <img width="30" style="" title="ShowPageTrace" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/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"> -</div> - -<script type="text/javascript"> - (function(){ - var tab_tit = document.getElementById('think_page_trace_tab_tit').getElementsByTagName('span'); - var tab_cont = document.getElementById('think_page_trace_tab_cont').getElementsByTagName('div'); - var open = document.getElementById('think_page_trace_open'); - var close = document.getElementById('think_page_trace_close').children[0]; - var trace = document.getElementById('think_page_trace_tab'); - var cookie = document.cookie.match(/thinkphp_show_page_trace=(\d\|\d)/); - var history = (cookie && typeof cookie[1] != 'undefined' && cookie[1].split('|')) || [0,0]; - open.onclick = function(){ - trace.style.display = 'block'; - this.style.display = 'none'; - close.parentNode.style.display = 'block'; - history[0] = 1; - document.cookie = 'thinkphp_show_page_trace='+history.join('|') - } - close.onclick = function(){ - trace.style.display = 'none'; - this.parentNode.style.display = 'none'; - open.style.display = 'block'; - history[0] = 0; - document.cookie = 'thinkphp_show_page_trace='+history.join('|') - } - for(var i = 0; i < tab_tit.length; i++){ - tab_tit[i].onclick = (function(i){ - return function(){ - for(var j = 0; j < tab_cont.length; j++){ - tab_cont[j].style.display = 'none'; - tab_tit[j].style.color = '#999'; - } - tab_cont[i].style.display = 'block'; - tab_tit[i].style.color = '#000'; - history[1] = i; - document.cookie = 'thinkphp_show_page_trace='+history.join('|') - } - })(i) - } - parseInt(history[0]) && open.click(); - tab_tit[history[1]].click(); - })(); -</script> diff --git a/thinkphp/tpl/think_exception.tpl b/thinkphp/tpl/think_exception.tpl deleted file mode 100755 index e80c57b..0000000 --- a/thinkphp/tpl/think_exception.tpl +++ /dev/null @@ -1,507 +0,0 @@ -<?php - if(!function_exists('parse_padding')){ - function parse_padding($source) - { - $length = strlen(strval(count($source['source']) + $source['first'])); - return 40 + ($length - 1) * 8; - } - } - - if(!function_exists('parse_class')){ - function parse_class($name) - { - $names = explode('\\', $name); - return '<abbr title="'.$name.'">'.end($names).'</abbr>'; - } - } - - if(!function_exists('parse_file')){ - function parse_file($file, $line) - { - return '<a class="toggle" title="'."{$file} line {$line}".'">'.basename($file)." line {$line}".'</a>'; - } - } - - if(!function_exists('parse_args')){ - function parse_args($args) - { - $result = []; - - foreach ($args as $key => $item) { - switch (true) { - case is_object($item): - $value = sprintf('<em>object</em>(%s)', parse_class(get_class($item))); - break; - case is_array($item): - if(count($item) > 3){ - $value = sprintf('[%s, ...]', parse_args(array_slice($item, 0, 3))); - } else { - $value = sprintf('[%s]', parse_args($item)); - } - break; - case is_string($item): - if(strlen($item) > 20){ - $value = sprintf( - '\'<a class="toggle" title="%s">%s...</a>\'', - htmlentities($item), - htmlentities(substr($item, 0, 20)) - ); - } else { - $value = sprintf("'%s'", htmlentities($item)); - } - break; - case is_int($item): - case is_float($item): - $value = $item; - break; - case is_null($item): - $value = '<em>null</em>'; - break; - case is_bool($item): - $value = '<em>' . ($item ? 'true' : 'false') . '</em>'; - break; - case is_resource($item): - $value = '<em>resource</em>'; - break; - default: - $value = htmlentities(str_replace("\n", '', var_export(strval($item), true))); - break; - } - - $result[] = is_int($key) ? $value : "'{$key}' => {$value}"; - } - - return implode(', ', $result); - } - } -?> -<!DOCTYPE html> -<html> -<head> - <meta charset="UTF-8"> - <title>系统发生错误</title> - <meta name="robots" content="noindex,nofollow" /> - <style> - /* Base */ - body { - color: #333; - font: 16px Verdana, "Helvetica Neue", helvetica, Arial, 'Microsoft YaHei', sans-serif; - margin: 0; - padding: 0 20px 20px; - } - h1{ - margin: 10px 0 0; - font-size: 28px; - font-weight: 500; - line-height: 32px; - } - h2{ - color: #4288ce; - font-weight: 400; - padding: 6px 0; - margin: 6px 0 0; - font-size: 18px; - border-bottom: 1px solid #eee; - } - h3{ - margin: 12px; - font-size: 16px; - font-weight: bold; - } - abbr{ - cursor: help; - text-decoration: underline; - text-decoration-style: dotted; - } - a{ - color: #868686; - cursor: pointer; - } - a:hover{ - text-decoration: underline; - } - .line-error{ - background: #f8cbcb; - } - - .echo table { - width: 100%; - } - - .echo pre { - padding: 16px; - overflow: auto; - font-size: 85%; - line-height: 1.45; - background-color: #f7f7f7; - border: 0; - border-radius: 3px; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; - } - - .echo pre > pre { - padding: 0; - margin: 0; - } - - /* Exception Info */ - .exception { - margin-top: 20px; - } - .exception .message{ - padding: 12px; - border: 1px solid #ddd; - border-bottom: 0 none; - line-height: 18px; - font-size:16px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - font-family: Consolas,"Liberation Mono",Courier,Verdana,"微软雅黑"; - } - - .exception .code{ - float: left; - text-align: center; - color: #fff; - margin-right: 12px; - padding: 16px; - border-radius: 4px; - background: #999; - } - .exception .source-code{ - padding: 6px; - border: 1px solid #ddd; - - background: #f9f9f9; - overflow-x: auto; - - } - .exception .source-code pre{ - margin: 0; - } - .exception .source-code pre ol{ - margin: 0; - color: #4288ce; - display: inline-block; - min-width: 100%; - box-sizing: border-box; - font-size:14px; - font-family: "Century Gothic",Consolas,"Liberation Mono",Courier,Verdana; - padding-left: <?php echo (isset($source) && !empty($source)) ? parse_padding($source) : 40; ?>px; - } - .exception .source-code pre li{ - border-left: 1px solid #ddd; - height: 18px; - line-height: 18px; - } - .exception .source-code pre code{ - color: #333; - height: 100%; - display: inline-block; - border-left: 1px solid #fff; - font-size:14px; - font-family: Consolas,"Liberation Mono",Courier,Verdana,"微软雅黑"; - } - .exception .trace{ - padding: 6px; - border: 1px solid #ddd; - border-top: 0 none; - line-height: 16px; - font-size:14px; - font-family: Consolas,"Liberation Mono",Courier,Verdana,"微软雅黑"; - } - .exception .trace ol{ - margin: 12px; - } - .exception .trace ol li{ - padding: 2px 4px; - } - .exception div:last-child{ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - } - - /* Exception Variables */ - .exception-var table{ - width: 100%; - margin: 12px 0; - box-sizing: border-box; - table-layout:fixed; - word-wrap:break-word; - } - .exception-var table caption{ - text-align: left; - font-size: 16px; - font-weight: bold; - padding: 6px 0; - } - .exception-var table caption small{ - font-weight: 300; - display: inline-block; - margin-left: 10px; - color: #ccc; - } - .exception-var table tbody{ - font-size: 13px; - font-family: Consolas,"Liberation Mono",Courier,"微软雅黑"; - } - .exception-var table td{ - padding: 0 6px; - vertical-align: top; - word-break: break-all; - } - .exception-var table td:first-child{ - width: 28%; - font-weight: bold; - white-space: nowrap; - } - .exception-var table td pre{ - margin: 0; - } - - /* Copyright Info */ - .copyright{ - margin-top: 24px; - padding: 12px 0; - border-top: 1px solid #eee; - } - - /* SPAN elements with the classes below are added by prettyprint. */ - pre.prettyprint .pln { color: #000 } /* plain text */ - pre.prettyprint .str { color: #080 } /* string content */ - pre.prettyprint .kwd { color: #008 } /* a keyword */ - pre.prettyprint .com { color: #800 } /* a comment */ - pre.prettyprint .typ { color: #606 } /* a type name */ - pre.prettyprint .lit { color: #066 } /* a literal value */ - /* punctuation, lisp open bracket, lisp close bracket */ - pre.prettyprint .pun, pre.prettyprint .opn, pre.prettyprint .clo { color: #660 } - pre.prettyprint .tag { color: #008 } /* a markup tag name */ - pre.prettyprint .atn { color: #606 } /* a markup attribute name */ - pre.prettyprint .atv { color: #080 } /* a markup attribute value */ - pre.prettyprint .dec, pre.prettyprint .var { color: #606 } /* a declaration; a variable name */ - pre.prettyprint .fun { color: red } /* a function name */ - </style> -</head> -<body> - <div class="echo"> - <?php echo $echo;?> - </div> - <?php if(\think\App::$debug) { ?> - <div class="exception"> - <div class="message"> - - <div class="info"> - <div> - <h2>[<?php echo $code; ?>] <?php echo sprintf('%s in %s', parse_class($name), parse_file($file, $line)); ?></h2> - </div> - <div><h1><?php echo nl2br(htmlentities($message)); ?></h1></div> - </div> - - </div> - <?php if(!empty($source)){?> - <div class="source-code"> - <pre class="prettyprint lang-php"><ol start="<?php echo $source['first']; ?>"><?php foreach ((array) $source['source'] as $key => $value) { ?><li class="line-<?php echo $key + $source['first']; ?>"><code><?php echo htmlentities($value); ?></code></li><?php } ?></ol></pre> - </div> - <?php }?> - <div class="trace"> - <h2>Call Stack</h2> - <ol> - <li><?php echo sprintf('in %s', parse_file($file, $line)); ?></li> - <?php foreach ((array) $trace as $value) { ?> - <li> - <?php - // Show Function - if($value['function']){ - echo sprintf( - 'at %s%s%s(%s)', - isset($value['class']) ? parse_class($value['class']) : '', - isset($value['type']) ? $value['type'] : '', - $value['function'], - isset($value['args'])?parse_args($value['args']):'' - ); - } - - // Show line - if (isset($value['file']) && isset($value['line'])) { - echo sprintf(' in %s', parse_file($value['file'], $value['line'])); - } - ?> - </li> - <?php } ?> - </ol> - </div> - </div> - <?php } else { ?> - <div class="exception"> - - <div class="info"><h1><?php echo htmlentities($message); ?></h1></div> - - </div> - <?php } ?> - - <?php if(!empty($datas)){ ?> - <div class="exception-var"> - <h2>Exception Datas</h2> - <?php foreach ((array) $datas as $label => $value) { ?> - <table> - <?php if(empty($value)){ ?> - <caption><?php echo $label; ?><small>empty</small></caption> - <?php } else { ?> - <caption><?php echo $label; ?></caption> - <tbody> - <?php foreach ((array) $value as $key => $val) { ?> - <tr> - <td><?php echo htmlentities($key); ?></td> - <td> - <?php - if(is_array($val) || is_object($val)){ - echo htmlentities(json_encode($val, JSON_PRETTY_PRINT)); - } else if(is_bool($val)) { - echo $val ? 'true' : 'false'; - } else if(is_scalar($val)) { - echo htmlentities($val); - } else { - echo 'Resource'; - } - ?> - </td> - </tr> - <?php } ?> - </tbody> - <?php } ?> - </table> - <?php } ?> - </div> - <?php } ?> - - <?php if(!empty($tables)){ ?> - <div class="exception-var"> - <h2>Environment Variables</h2> - <?php foreach ((array) $tables as $label => $value) { ?> - <table> - <?php if(empty($value)){ ?> - <caption><?php echo $label; ?><small>empty</small></caption> - <?php } else { ?> - <caption><?php echo $label; ?></caption> - <tbody> - <?php foreach ((array) $value as $key => $val) { ?> - <tr> - <td><?php echo htmlentities($key); ?></td> - <td> - <?php - if(is_array($val) || is_object($val)){ - echo htmlentities(json_encode($val, JSON_PRETTY_PRINT)); - } else if(is_bool($val)) { - echo $val ? 'true' : 'false'; - } else if(is_scalar($val)) { - echo htmlentities($val); - } else { - echo 'Resource'; - } - ?> - </td> - </tr> - <?php } ?> - </tbody> - <?php } ?> - </table> - <?php } ?> - </div> - <?php } ?> - - <div class="copyright"> - <a title="官方网站" href="http://www.thinkphp.cn">ThinkPHP</a> - <span>V<?php echo THINK_VERSION; ?></span> - <span>{ 十年磨一剑-为API开发设计的高性能框架 }</span> - </div> - <?php if(\think\App::$debug) { ?> - <script> - var LINE = <?php echo $line; ?>; - - function $(selector, node){ - var elements; - - node = node || document; - if(document.querySelectorAll){ - elements = node.querySelectorAll(selector); - } else { - switch(selector.substr(0, 1)){ - case '#': - elements = [node.getElementById(selector.substr(1))]; - break; - case '.': - if(document.getElementsByClassName){ - elements = node.getElementsByClassName(selector.substr(1)); - } else { - elements = get_elements_by_class(selector.substr(1), node); - } - break; - default: - elements = node.getElementsByTagName(); - } - } - return elements; - - function get_elements_by_class(search_class, node, tag) { - var elements = [], eles, - pattern = new RegExp('(^|\\s)' + search_class + '(\\s|$)'); - - node = node || document; - tag = tag || '*'; - - eles = node.getElementsByTagName(tag); - for(var i = 0; i < eles.length; i++) { - if(pattern.test(eles[i].className)) { - elements.push(eles[i]) - } - } - - return elements; - } - } - - $.getScript = function(src, func){ - var script = document.createElement('script'); - - script.async = 'async'; - script.src = src; - script.onload = func || function(){}; - - $('head')[0].appendChild(script); - } - - ;(function(){ - var files = $('.toggle'); - var ol = $('ol', $('.prettyprint')[0]); - var li = $('li', ol[0]); - - // 短路径和长路径变换 - for(var i = 0; i < files.length; i++){ - files[i].ondblclick = function(){ - var title = this.title; - - this.title = this.innerHTML; - this.innerHTML = title; - } - } - - // 设置出错行 - var err_line = $('.line-' + LINE, ol[0])[0]; - err_line.className = err_line.className + ' line-error'; - - $.getScript('//cdn.bootcss.com/prettify/r298/prettify.min.js', function(){ - prettyPrint(); - - // 解决Firefox浏览器一个很诡异的问题 - // 当代码高亮后,ol的行号莫名其妙的错位 - // 但是只要刷新li里面的html重新渲染就没有问题了 - if(window.navigator.userAgent.indexOf('Firefox') >= 0){ - ol[0].innerHTML = ol[0].innerHTML; - } - }); - - })(); - </script> - <?php } ?> -</body> -</html> diff --git a/vendor/index.html b/vendor/index.html deleted file mode 100644 index e69de29..0000000